读书人

新手求教Windows下Socket 编程的有关问

发布时间: 2012-02-17 17:50:42 作者: rapoo

新手求教Windows下Socket 编程的问题
我用C语言写了一个很简单的服务器程序,但是报错,总是绑定错误~以下是源代码~请大虾们帮我诊断一下是什么问题?用的VS2005~工程为win32控制台空项目~C语言编写~
#include <stdio.h>
#include <winsock.h>

#pragma comment (lib, "ws2_32.lib ")

#define SVR_PORT (unsigned short)3000
#define CLN_PORT (unsigned short)4000

main()
{
SOCKET dwSvrSock;

struct sockaddr_in tSvrAddr;
struct sockaddr_in tClnAddr;
unsigned int dwAddrLen = sizeof (struct sockaddr_in);

fd_set readfds;

WORD wVersionRequested;
WSADATA wsaData;

int rtn;
char recv[10];

wVersionRequested = MAKEWORD(1, 1);

rtn = WSAStartup(wVersionRequested, &wsaData);
if (rtn != 0)
{
printf ( "Socket startup error!\n ");
return;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
printf ( "Socket Version error!\n ");
return;
}

dwSvrSock = socket(AF_INET, SOCK_DGRAM, 0);
if (dwSvrSock == INVALID_SOCKET)
{
printf ( "Socket fail!\n ");
return;
}
tSvrAddr.sin_family = AF_INET;
tSvrAddr.sin_port = htons (SVR_PORT);
tSvrAddr.sin_addr.s_addr = inet_addr( "127.0.0.1 ");

rtn = bind (dwSvrSock, (struct sockaddr *)&tSvrAddr, dwAddrLen);
if (rtn == 0)
{
printf ( "Bind fail!\n ");
closesocket(dwSvrSock);
return;
}

while(1)
{
FD_ZERO(&readfds);
FD_SET(dwSvrSock, &readfds);

rtn = select((int)dwSvrSock + 1, &readfds, NULL, NULL, NULL);



if (rtn > 0)
{
if (FD_ISSET(dwSvrSock, &readfds))
{
memset(recv, 0, 10);
recvfrom(dwSvrSock, recv, 10, 0, (struct sockaddr *)&tClnAddr, &dwAddrLen);
if(rtn == SOCKET_ERROR)
{
printf( "Recive fail!\n ");
}
else
{
printf ( "%s\n ", recv);
}
}
}
}
}

[解决办法]
用 WSAGetLastError 取错误代码 就知道原因了
[解决办法]

#include <stdio.h>
#include <winsock.h>

#pragma comment (lib, "ws2_32.lib ")

#define SVR_PORT (unsigned short)3000
#define CLN_PORT (unsigned short)4000

void main()
{
SOCKET dwSvrSock;

struct sockaddr_in tSvrAddr;
struct sockaddr_in tClnAddr;
unsigned int dwAddrLen = sizeof (struct sockaddr_in);

fd_set readfds;

WORD wVersionRequested;
WSADATA wsaData;

int rtn;
char recv[10];

wVersionRequested = MAKEWORD(1, 1);

rtn = WSAStartup(wVersionRequested, &wsaData);
if (rtn != 0)
{
printf ( "Socket startup error!\n ");
return;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
printf ( "Socket Version error!\n ");
return;
}

dwSvrSock = socket(AF_INET, SOCK_DGRAM, 0);
if (dwSvrSock == INVALID_SOCKET)
{
printf ( "Socket fail!\n ");
return;
}
tSvrAddr.sin_family = AF_INET;
tSvrAddr.sin_port = htons (SVR_PORT);
tSvrAddr.sin_addr.s_addr = inet_addr( "127.0.0.1 ");


rtn = bind (dwSvrSock, (struct sockaddr *)&tSvrAddr, dwAddrLen);
if (rtn != 0)
{
printf ( "Bind fail!\n ");
closesocket(dwSvrSock);
return;
}

while(1)
{
FD_ZERO(&readfds);
FD_SET(dwSvrSock, &readfds);

rtn = select((int)dwSvrSock + 1, &readfds, NULL, NULL, NULL);

if (rtn > 0)
{
if (FD_ISSET(dwSvrSock, &readfds))
{
memset(recv, 0, 10);
recvfrom(dwSvrSock, recv, 10, 0, (struct sockaddr *)&tClnAddr, (int*)&dwAddrLen);
if(rtn == SOCKET_ERROR)
{
printf( "Recive fail!\n ");
}
else
{
printf ( "%s\n ", recv);
}
}
}
}
}

读书人网 >C语言

热点推荐