首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-02-17 
新手求教Windows下Socket 编程的问题我用C语言写了一个很简单的服务器程序,但是报错,总是绑定错误~以下是

新手求教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);
}
}
}
}
}

热点排行