读书人

崩溃了。为啥小弟我写的winsock老是re

发布时间: 2012-10-10 13:58:11 作者: rapoo

崩溃了。。。为啥我写的winsock老是recv失败呢?求指导!!!
小弟刚刚开始学socket,用winsock写了一个server,是先socket然后bind,listen,accept,recv;client端是socket,connect,然后send 但是老是在recv这部出错,请众大牛指导一下啊。。。。。不胜感激~~


附代码:
服务器
#include <stdio.h>
#include <windows.h>
#include <winsock.h>
#pragma comment(lib,"wsock32.lib")
#define MYPORT 4444
#define BACKLOG 10
#define MAXDATASIZE 1024
int main()
{
int err_code,sin_size,numbytes;
int ser_sockfd,new_fd;
char buf[MAXDATASIZE];
WORD v;
WSADATA WD;
struct sockaddr_in my_addr,their_addr;
v=MAKEWORD(1,1);
err_code=WSAStartup(v,&WD);
if(err_code!=0)
{
printf("WSAStartup");
system("pause");
exit(1);

}
ser_sockfd=socket(AF_INET,SOCK_STREAM,0);
if (ser_sockfd<0)
{
err_code=GetLastError();
printf("socket Error:%s\n",strerror(err_code));
system("pause");
exit(1);
}
memset((struct sockaddr_in*)&my_addr,0,sizeof(struct sockaddr_in));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(ser_sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))<0)
{
err_code=GetLastError();
printf("bind Error:%s\n",strerror(err_code));
system("pause");
exit(1);
}
if (listen(ser_sockfd,BACKLOG)<0)
{
err_code=GetLastError();
printf("listen Error:%s\n",strerror(err_code));
system("pause");
exit(1);
}
while (1)
{
sin_size = sizeof(struct sockaddr_in);
if (new_fd = accept(ser_sockfd, (struct sockaddr *)&their_addr, &sin_size)<=0)
{
err_code=GetLastError();
printf("accept Error:%s\n",strerror(err_code));
system("pause");
} else
{
if (numbytes=recv(new_fd, buf, MAXDATASIZE, 0)<=0)
{
err_code=GetLastError();
printf("recv Error:%s\n",strerror(err_code));
system("pause");
exit(1);
}
buf[numbytes] = '\0';
printf("Received: %s\n",buf);
shutdown(new_fd,2);
}
}
shutdown(ser_sockfd,2);
WSACleanup();
system("pause");
}
客户端
#include <stdio.h>
#include <windows.h>
#include <winsock.h>
#pragma comment(lib,"wsock32.lib")
#define DEST_PORT 4444
#define MAXDATASIZE 1024
int main()
{
int err_code,numbytes;
char buf[MAXDATASIZE];
int cli_sockfd;
WORD v;
WSADATA WD;
struct sockaddr_in dest_addr;
v=MAKEWORD(1,1);
err_code=WSAStartup(v,&WD);
char DEST_IP[14];
if(err_code!=0)
{
printf("WSAStartup");
system("pause");
exit(1);
}
cli_sockfd=socket(AF_INET,SOCK_STREAM,0);
if (cli_sockfd<0)
{
err_code=GetLastError();
printf("socket Error:%s\n",strerror(err_code));


system("pause");
exit(1);
}
printf("Please input server address:");
scanf("%s",DEST_IP);
memset((struct sockaddr_in*)&dest_addr,0,sizeof(struct sockaddr_in));
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(DEST_PORT);
dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
if (connect(cli_sockfd,(struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in))!=0)
{
err_code=GetLastError();
printf("connect Error:%s\n",strerror(err_code));
system("pause");
exit(1);
}
char msg[MAXDATASIZE];
strcpy(msg,"hi,I am client!");
if (send(cli_sockfd,msg,sizeof(msg),0)<0)
{
err_code=GetLastError();
printf("socket Error:%s\n",strerror(err_code));
system("pause");
exit(1);
}
shutdown(cli_sockfd,2);
WSACleanup();
system("pause");
return(1);
}



[解决办法]
if ((new_fd = accept(ser_sockfd, (struct sockaddr *)&their_addr, &sin_size))<=0)
if ((numbytes=recv(new_fd, (char*)buf, MAXDATASIZE, 0))<=0)

加括号啊
[解决办法]
小伙子都学网络编程了,有两本极为经典的书籍,C++网络编程,不薄不厚。

读书人网 >C++

热点推荐