当我在客户端 - 服务器应用程序的服务器端调用accept()函数时,我收到错误“无效的参数”。我没有弄错,如果你看到有什么问题,请告诉我。感谢。
#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;
}
答案 0 :(得分:3)
对于Unix域套接字,您必须使用sockaddr_un
而不是sockaddr_in
,或者将AF_UNIX
替换为AF_INET
。
另外,请检查听说的回归。
另外更改此行
readval = (sockfd,buffer,sizeof(buffer));
与
readval = read(newsockfd,buffer,sizeof(buffer));
因为数据将通过新创建的套接字发送,而不是通过监听套接字发送
另外,如@trojanfoe所述,将server
client
结构放入accept()
来电
答案 1 :(得分:1)
这一行:
newsockfd = accept (sockfd, (struct sockaddr *)&server, &len);
应该是:
newsockfd = accept (sockfd, (struct sockaddr *)&client, &len);
来自manpage:
参数addr是一个指向sockaddr结构的指针。这种结构 用已知的对等套接字的地址填充 通信层。返回addr的地址的确切格式是 由套接字的地址族决定(参见socket(2)和 各自的协议手册页)。当addr为NULL时,不会填充任何内容 在;在这种情况下,不使用addrlen,也应该为NULL。
同时检查listen()
的返回值。
答案 2 :(得分:1)
看起来你的套接字遇到了一些麻烦,所以我上传了一个老师给我一次的指导,以便快速介绍网络编程。希望能帮助到你。
答案 3 :(得分:0)
之前我遇到过类似的问题,这是因为循环中没有读取函数。这是我之前做过的一个例子。
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);
}