套接字,accept()函数,参数无效
在客户端-服务器应用程序的服务器端调用accept()函数时,出现错误“Invalid argument”。我不明白什么是错的,如果你看到什么是错的,请让我知道。谢谢套接字,accept()函数,参数无效,c,linux,sockets,C,Linux,Sockets,在客户端-服务器应用程序的服务器端调用accept()函数时,出现错误“Invalid argument”。我不明白什么是错的,如果你看到什么是错的,请让我知道。谢谢 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char* argv[]) { int sockfd,
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char* argv[])
{
int sockfd, newsockfd, portno, len;
struct sockaddr_in server, client;
if(argc < 2){
perror("Add more arguments");
}
sockfd = socket(AF_UNIX,SOCK_STREAM,0);
if(sockfd < 0){
perror("Error at socket()");
}
printf("Socketfd: %d\n",sockfd);
bzero((char *)&server, sizeof(server));
portno = atoi(argv[1]);
server.sin_family = AF_UNIX;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(portno);
if(bind (sockfd, (struct sockaddr *)&server, sizeof(server)) <0){
perror("Error at bind ()-server");
}
listen(sockfd,5);
int readval;
char buffer[256];
for(;;){
len = sizeof(client);
newsockfd = accept (sockfd, (struct sockaddr *)&server,&len);
if (newsockfd == -1){
perror("Erroare at accept()");
}
else do{
readval = (sockfd,buffer,sizeof(buffer));
if (readval < 0 ){
perror("Error at reading()");
}
else if (readval == 0){
printf("End conection");
}
else{
printf("Mesage is: %s\n", buffer);
}
}while (readval > 0);
close(newsockfd);
}
return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int sockfd、newsockfd、端口号、len;
服务器、客户端中的结构sockaddr_;
如果(argc<2){
perror(“添加更多参数”);
}
sockfd=socket(AF_UNIX,SOCK_流,0);
if(sockfd<0){
perror(“套接字()处出错”);
}
printf(“Socketfd:%d\n”,sockfd);
bzero((char*)&server,sizeof(server));
portno=atoi(argv[1]);
server.sin_family=AF_UNIX;
server.sin\u addr.s\u addr=INADDR\u ANY;
server.sin_port=htons(端口号);
if(bind(sockfd,(struct sockaddr*)&server,sizeof(server))0);
关闭(newsockfd);
}
返回0;
}
此行:
newsockfd = accept (sockfd, (struct sockaddr *)&server, &len);
应该是:
newsockfd = accept (sockfd, (struct sockaddr *)&client, &len);
从:
参数addr是指向sockaddr结构的指针。这个结构
由对等套接字的地址填充,如
通信层。返回地址addr的确切格式为
由套接字的地址族确定(参见套接字(2)和
各协议手册页)。当addr为NULL时,不填充任何内容
在里面在本例中,不使用addrlen,也应为NULL
还要检查
listen()
中的返回值。对于Unix域套接字,您必须使用sockaddr\u un
而不是sockaddr\u in
,或者用AF\u INET
替换AF\u Unix
另外,检查listen的返回
再加上换这一行
readval = (sockfd,buffer,sizeof(buffer));
与
因为数据将通过新创建的套接字而不是侦听套接字发送
另外,正如@trojanfoe所提到的,将
服务器
和客户端
结构替换为accept()
调用之前我遇到过类似的问题,这是因为循环中没有读取功能。这是我以前做过的一个例子
while (1) {
new_sockfd = accept(sockfd, (struct sockaddr *) &client_addr,
&sin_size);
if (new_sockfd == -1)
perror("accepting connection");
printf("server: got connection from %s port %d\n",
inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));
recv_length = recv(new_sockfd, &buffer, DATA, 0);
while (recv_length > 0) {
printf("RECV: %d bytes\n", recv_length);
dump(buffer, recv_length);
recv_length = recv(new_sockfd, &buffer, DATA, 0);
}
close(new_sockfd);
}
您将
len
设置为sizeof(客户端)
,但传入&服务器
?(我认为这不是你的问题,但它不可能是对的。)这里缺少一些东西:readval=(sockfd,buffer,sizeof(buffer))
您还需要检查listen()
的返回值。为什么要将&server
强制转换为struct sockaddr*
,而它已经是该类型???好的,所以我的sock id是3。我检查了listen的返回值,它是-1(因此我在那里也得到了一个错误)。此外,在这些更改之后,我在bind上也遇到了一个错误(“地址已在使用”)。好的,这个错误在listen
中非常常见,您需要setsockopt()
以便重用端口。listen()
是问题的根本原因,而不是我的回答中所述的传递给accept()
的错误地址(这只会导致一个小错误)。
while (1) {
new_sockfd = accept(sockfd, (struct sockaddr *) &client_addr,
&sin_size);
if (new_sockfd == -1)
perror("accepting connection");
printf("server: got connection from %s port %d\n",
inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));
recv_length = recv(new_sockfd, &buffer, DATA, 0);
while (recv_length > 0) {
printf("RECV: %d bytes\n", recv_length);
dump(buffer, recv_length);
recv_length = recv(new_sockfd, &buffer, DATA, 0);
}
close(new_sockfd);
}