C在Socket上编程的Windows错误听,但没有errno
问题描述:
我已经完成了其他语言的套接字编程,但从来没有处理直接在C中进行处理。我试图设置一个简单的服务器来侦听Windows下的端口8080。我使用mingw附带的gcc编译代码。C在Socket上编程的Windows错误听,但没有errno
#include <stdio.h>
#include <string.h>
#include <WinSock2.h>
#include <stdint.h>
#include <time.h>
int main(void) {
int s;
int len;
char buffer[1025];
struct sockaddr_in servAddr;
struct sockaddr_in clntAddr;
int clntAddrLen; //length of client socket addre
//Build local (server) socket add
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(8080);
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
//create socket
if((s=socket(AF_INET, SOCK_STREAM, 0) %lt; 0)){
perror("Error: Socket Failed!");
printf("%d\n", errno);
exit(1);
}
//bind socket to local address and port
if((bind(s,(struct sockaddr*)&servAddr, sizeof(servAddr)) %lt; 0))
{
perror("Error:bind failed!");
printf("%d\n", errno);
exit(1);
}
for(;;)
{
len = recvfrom(s,buffer, sizeof(buffer),0,(struct sockaddr*)&clntAddr, &clntAddrLen);
//send string
sendto(s, buffer, len, 0, (struct sockaddr*)&clntAddr, sizeof(clntAddr));
}
}
当我运行代码时,它出错了绑定,但没有错误。此代码是从这个线程采取并稍作修改:Windows Socket Programming in C
但没有错误代码。输出打印出没有错误。它在绑定失败,我不知道为什么。我一直在拼凑一些不同的来源。我简直就是想在Windows上用C语言做一个hello world/3 way握手。
在此先感谢。
答
这是不正确由于operator precedence:
if((s=socket(AF_INET, SOCK_STREAM, 0) < 0)){
为<
比=
更高的优先级。这意味着代码将根据socket(AF_INET, SOCK_STREAM, 0) < 0
的结果分配1
或0
到s
。 更改为:
if((s=socket(AF_INET, SOCK_STREAM, 0)) < 0){
使用WSAGetLastError()
获得失败的原因,而不是errno
。来自MSDN bind()
参考页:
如果没有错误发生,则bind返回零。否则,它将返回SOCKET_ERROR,,通过调用WSAGetLastError可以检索特定的错误代码。
在Windows上调用WSAStartup()
之前,必须调用任何套接字函数。
另外,'WSACleanup()'应该在使用套接字完成时运行。 – ehudt 2013-04-03 20:28:55