【发布时间】:2023-07-14 01:21:01
【问题描述】:
我有一个非常简单的客户端和服务器代码:
客户
int sockfd = 0;
int bytesReceived = 0;
char recvBuff[BUFSIZE];
memset(recvBuff, '0', sizeof(recvBuff));
struct sockaddr_in serv_addr;
printf("here i am\n");
/* Create a socket first */
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0){
printf("\n Error : Could not create socket \n");
return 1;
}
fprintf(stderr, "connection stats\n");
fprintf(stderr, "connecting to %d - %s \n",port,server);
/* Initialize sockaddr_in data structure */
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port); // port
serv_addr.sin_addr.s_addr = server;
printf(" attempting connection %s:%d\n", server, port);
/* Attempt a connection */
int con = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
printf("Error %d\n", con);
exit(-1);
和服务器
int listenfd = 0;
int connfd = 0;
struct sockaddr_in serv_addr;
char sendBuff[BUFSIZE];
int numrv;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
printf("Socket retrieve success\n");
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff));
printf("here 2\n");
serv_addr.sin_family = AF_INET;
printf("here 3\n");
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
printf("here 4\n");
serv_addr.sin_port = htons(port);
printf("here 5\n");
int optval = 1;
printf(" opening port %d\n", port);
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,
(const void *) &optval, sizeof(int));
bind(listenfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
printf("binded\n");
while (1) {
connfd = accept(listenfd, (struct sockaddr *) NULL, NULL);
printf("connfd %d", connfd);
close(connfd);
sleep(1);
}
客户端输出:
here i am
connecting to 8888 - localhost
attempting connection localhost:8888
服务器输出
Socket retrieve success
here 2
here 3
here 4
here 5
opening port 8888
binded
在等待几分钟后.. 我观察到以下内容: 客户:
here i am
connecting to 8888 - localhost
attempting connection localhost:8888
Error -1
服务器:
Socket retrieve success
here 2
here 3
here 4
here 5
opening port 8888
binded
connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd
-1,我可以猜到连接失败了。 我不确定我错过了什么?
【问题讨论】:
-
您应该在
connfd %d之后放置一个\n,否则printf 的输出将被缓冲,当它发生时您将看不到它。您也可以调用fflush打印缓冲输出 -
@Eregrith:你是对的..所以基本上,连接立即失败..但我不确定..为什么服务器不接受客户端连接..
-
看看
errno和perror可能会有所帮助,请与the connect() manual 交叉 -
理论上connect应该阻塞,但这取决于你的环境。尝试不要立即退出客户端,而是发送一些数据并在循环中等待一段时间(100ms)。
-
@vbence 如果连接返回
-1,您将无法发送一些数据。