- 最後登錄
- 2024-5-6
- 在線時間
- 28995 小時
- 註冊時間
- 2011-12-11
- 閱讀權限
- 95
- 精華
- 3
- UID
- 10643381
- 帖子
- 3222
- 積分
- 24364 點
- 潛水值
- 77260 米
| 本帖最後由 snowflying 於 2013-11-23 07:38 PM 編輯
最近在寫 socket programming 的部分,遇到了一些問題
先附上兩份 code (server 與 client)
server :
- //server
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #define PORT 2727
- using namespace std;
- int listenfd , clifd;
- sockaddr_in servaddr , cliaddr;
- int main(int argc , char *argv[])
- {
- listenfd = socket(AF_INET , SOCK_STREAM , 0);
- memset(&servaddr , 0 , sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(PORT);
- int sopt = 1;
- setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (void*)&sopt, sizeof(sopt));
- bind(listenfd , (sockaddr *) &servaddr , sizeof(servaddr));
- listen(listenfd , 100);
- while(true)
- {
- socklen_t clilen = sizeof(cliaddr);
- clifd = accept(listenfd , (sockaddr*) &cliaddr , &clilen);
-
- send(clifd , "XDDD\n" , strlen("XDDD\n") + 1 , 0);
- //sleep(2);
- send(clifd , "XDDD2\n" , strlen("XDDD2\n") + 1 , 0);
- //sleep(2);
- send(clifd , "XDDD3\n" , strlen("XDDD3\n") + 1 , 0);
- //sleep(2);
-
- close(clifd);
- }
- return 0;
- }
複製代碼
client :
- //client
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #define BUF_LEN 1000
- using namespace std;
- int main(int argc , char *argv[])
- {
- if(argc < 3)
- exit(1);
- int servfd;
- sockaddr_in servaddr;
- in_addr ia;
- memset(&servaddr , 0 , sizeof(servaddr));
- servfd = socket(AF_INET , SOCK_STREAM , 0);
- servaddr.sin_family = AF_INET;
- inet_aton(argv[1] , &ia);
- servaddr.sin_addr = ia;
- servaddr.sin_port = htons(atoi(argv[2]));
- if(connect(servfd , (sockaddr*) &servaddr , (socklen_t) sizeof(servaddr)) < 0)
- exit(1);
-
- char sendline[BUF_LEN] , recvline[BUF_LEN];
- while(true)
- {
- memset(recvline , 0 , sizeof(recvline));
- read(servfd , recvline , BUF_LEN );
- print f("%s\n" , recvline);
- fflush(stdout);
- sleep(4);
- read(servfd , recvline , BUF_LEN );
- print f("%s\n" , recvline);
- fflush(stdout);
- sleep(4);
- read(servfd , recvline , BUF_LEN );
- print f("%s\n" , recvline);
- fflush(stdout);
- sleep(4);
- close(servfd);
- break;
- }
- return 0;
- }
複製代碼
這兩份 code 是大略簡化過的,原本是還有 select 等
不過經過測試後,覺得問題應該是出在這個地方
依照上面兩份 code 執行結果 (ubuntu or BSD)
client 拿到的全為 "XDDD"
但是
1. 使用 telnet (即不使用此 client 程式) ,拿到結果為正確的 ("XDDD" 、 "XDDD2" 、 "XDDD3")
2. 若把 server 的 code 中 sleep(2) 的註解全拿掉,使用此 client 程式,所拿到的結果也會是正確的
不知道是否有哪裡沒處理好,需要新增或修改的地方
也想了解直接藉由 telnet 與此 client 有何差異,為何可以拿到正確的結果
還請版上各位指點一下,感謝!
... |
|