我制作简单的server.c,这样做:
这是代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2) {
fprintf(stderr,"ERROR, no port ..\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
perror("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
p error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
accpt:
while (newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen) < 0)
{
/* i don't know return value for "there is no pending connection" in accept() function, so i use -1 value" */
bzero(buffer,256);
n = read(newsockfd,buffer,255);
....... // Process data, and etc //
}
goto accept
}
答案 0 :(得分:2)
责备它优先权。 原文:
while (newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen) < 0) { ...}
修正版:
while ((newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen)) < 0) { ...}
// ^ ? ^ ?
如果没有额外的括号,<
优先于=
,<{1>}优于,并且该语句将被评估为while (newsockfd = (accept(sockfd, (struct sockaddr *) &cli_addr, &clilen) < 0) ) { ...}
,将<
比较的结果分配给newsockfd,这显然不是意图。
以上是避免复合作业的一个很好的理由,而是使用这样的成语:
while (1) {
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd >= 0) break;
...}
顺便说一下:在OQ中,<
的方向也是完全错误的; while {...}
中的内容似乎处理传入的连接,这需要一个文件描述符>= 0
。
答案 1 :(得分:1)
如果没有待处理的关联,accept
将不会返回;它将阻塞,直到有连接,然后它将返回。您可以通过使套接字无阻塞来立即返回,但默认情况下,它们是阻塞的,并且上述行为成立。
答案 2 :(得分:1)
我不知道&#34的返回值;没有未决的连接&#34;在accept()函数中
没有。在有接受连接之前它不会返回。它会阻止。