Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:listen()API返回-1_C_Windows_Sockets - Fatal编程技术网

C:listen()API返回-1

C:listen()API返回-1,c,windows,sockets,C,Windows,Sockets,我用下面的代码在c中创建一个服务器程序。代码取自 #包括 #包括 #包括 #包括 int main(){ int welcomeSocket、newSocket; 字符缓冲区[1024]; serverAddr中的结构sockaddr\u; 结构sockaddr_存储服务器存储; 袜子尺寸; /*----创建套接字。三个参数是:----*/ /*1)Internet域2)流套接字3)默认协议(本例中为TCP)*/ welcomeSocket=套接字(PF_INET,SOCK_STREAM,0);

我用下面的代码在c中创建一个服务器程序。代码取自

#包括
#包括
#包括
#包括
int main(){
int welcomeSocket、newSocket;
字符缓冲区[1024];
serverAddr中的结构sockaddr\u;
结构sockaddr_存储服务器存储;
袜子尺寸;
/*----创建套接字。三个参数是:----*/
/*1)Internet域2)流套接字3)默认协议(本例中为TCP)*/
welcomeSocket=套接字(PF_INET,SOCK_STREAM,0);
/*----配置服务器地址结构的设置----*/
/*地址家庭=互联网*/
serverAddr.sin_family=AF_INET;
/*设置端口号,使用htons函数使用正确的字节顺序*/
serverAddr.sinu端口=htons(7891);
/*将IP地址设置为本地主机*/
serverAddr.sin_addr.s_addr=inet_addr(“127.0.0.1”);
/*将填充字段的所有位设置为0*/
memset(serverAddr.sin_zero,'\0',serverAddr.sin_zero的大小);
/*----将地址结构绑定到套接字----*/
绑定(welcomeSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
/*----在套接字上侦听,队列中最多有5个连接请求----*/
如果(监听(welcomeSocket,5)==0)
printf(“监听”);
其他的
printf(“错误%d\n”,侦听(welcomeSocket,5));
/*----Accept call为传入连接创建一个新套接字----*/
地址大小=服务器存储的大小;
newSocket=accept(welcomeSocket,(struct sockaddr*)和服务器存储,以及地址大小);
/*----将消息发送到传入连接的套接字----*/
strcpy(缓冲区,“Hello World\n”);
发送(newSocket,缓冲区,13,0);
getch();
返回0;
}
为了使代码在dev-c中工作,我对代码做了一点修改,但在输出中它出现了打印错误,即它正在执行
else
条件。有人知道为什么吗?如何调试这个


我已尝试更改端口号。它不起作用。

在Windows上,您必须先通过调用初始化网络子系统,然后才能调用套接字/网络相关函数

WSADATA wsaData;
int wsaRc = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (wsaRc != 0) {
   fprintf(stderr, "WSAStartup failed with error: %d\n", wsaRc);
   return 1;
}

/* Socket related functions callable from here on */
您链接的示例代码是为UNIX系统编写的,这些系统没有API要求


请注意,您也

[…]必须为每次成功调用该函数 调用WSAStartup函数的时间


(来自文档)。

在Windows上,您必须先通过调用初始化网络子系统,然后才能调用套接字/网络相关函数

WSADATA wsaData;
int wsaRc = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (wsaRc != 0) {
   fprintf(stderr, "WSAStartup failed with error: %d\n", wsaRc);
   return 1;
}

/* Socket related functions callable from here on */
您链接的示例代码是为UNIX系统编写的,这些系统没有API要求


请注意,您也

[…]必须为每次成功调用该函数 调用WSAStartup函数的时间


(来自文档)。

使用命令行上的
net helpmsg
查找错误号很有帮助。1) 检查socket()和bind()以及send()返回的值以确保操作成功2)在对错误作出反应时输出消息时,请使用“peror()”,以便也输出操作系统/系统消息。3) “缓冲区”中的字符数将有所不同,具体取决于底层操作系统。建议:'send(newSocket,buffer,strlen(buffer),0);'在windows上,oops需要使用getlasterror()和类似语句,而不是perror()。在命令行上使用
net helpmsg
查找错误号很有帮助。1) 检查socket()和bind()以及send()返回的值以确保操作成功2)在对错误作出反应时输出消息时,请使用“peror()”,以便也输出操作系统/系统消息。3) “缓冲区”中的字符数将有所不同,具体取决于底层操作系统。建议:'send(newSocket,buffer,strlen(buffer),0);'在windows上的oops,则需要使用getlasterror()和类似语句,而不是perror()。请解释这段代码到底在做什么?我添加了MSDN文档链接以进一步说明。来自MSDN:“WSAStartup函数通过进程启动Winsock DLL的使用。”Winsock DLL包含所有与套接字相关的函数。非常感谢。将检查文档。:)你能解释一下这段代码到底在做什么吗?为了进一步澄清,我添加了MSDN文档链接。来自MSDN:“WSAStartup函数通过进程启动Winsock DLL的使用。”Winsock DLL包含所有与套接字相关的函数。非常感谢。将检查文档。:)