simplex-talk:accept:简单套接字程序的参数错误无效

时间:2016-09-13 17:03:24

标签: c sockets

我通常不用C写任何东西,所以请原谅我完全缺乏经验。我正在尝试我的教科书中的代码,它给了我一个错误。我编译了客户端和服务器可执行文件。我运行服务器./server和客户端./client localhost。每当我运行客户端时,包含服务器的终端将显示错误simplex-talk:accept:无效的参数。我在某处读过,可能是参数是一个"值结果参数。"我不知道这意味着什么或它如何适用于此。这是代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <cstdlib>
#include <cstdio>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#
#define SERVER_PORT 20169
#define MAX_PENDING 5
#define MAX_LINE 256
int
main()
{
struct sockaddr_in sin;
char buf[MAX_LINE];
socklen_t len;
int s, new_s;
/* build address data structure */
memset((char *)&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(SERVER_PORT);
/* setup passive open */
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror("simplex-talk: socket");
exit(1);
}
if ((bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0) {
perror("simplex-talk: bind");
exit(1);
}
listen(s, MAX_PENDING);
/* wait for connection, then receive and print text */
while(1) {
if ((new_s = accept(s, (struct sockaddr *)&sin, &len)) < 0) {
perror("simplex-talk: accept");
exit(1);
}
while (len = recv(new_s, buf, sizeof(buf), 0))
fputs(buf, stdout);
close(new_s);
}
}

1 个答案:

答案 0 :(得分:0)

您必须将len初始化为sizeof(sin)。否则(man 2 accept),

  

EINVAL Socket没有收听连接,或addrlen无效(例如,是否定的)。