//服务器代码如下:
// server.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "winsock.h"
#include "stdio.h"
#include "stdlib.h"int main(int argc, char* argv[])
{
int sock,length;
struct sockaddr_in server;
int msgsock;
char buf[1024];
int  rval; WORD wVersionRequested;
WSADATA wsaData; wVersionRequested = MAKEWORD(2,0);
int err=WSAStartup(wVersionRequested,&wsaData);
//如果不能初始化WinSock,退出
if(err==-1){
perror("WSAStartup");
exit(1);
} //调用socket函数,建立自己的套接口
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0){
perror("Opening stream socket");
exit(1);
} server.sin_family = AF_INET;
server.sin_port   = htons(7016);
server.sin_addr.s_addr=INADDR_ANY; //调用bingd()函数建立服务器本地的绑定
if(bind(sock,(const struct sockaddr*)&server,sizeof(server))<0){
perror("binding stream socket");
exit(1);
}
length=sizeof(server);
//getsockname()函数获取一个套接口的本地名字
if(getsockname(sock,(struct sockaddr*)&server,&length)<0){
perror("GETING socket name");
exit(1);
}
printf("socket port #%d\n",ntohs(server.sin_port)); //调用listen()函数,表示开始侦听
listen(sock,5);
do{
//通过accept()调用等待接受连接
msgsock=accept(sock,0,(int*)0);
printf("Have client connected.\n");
if(msgsock==-1)
perror("accept");
else
do{
memset(buf,0,sizeof(buf));
//调用recv函数接收数据
if((rval=recv(msgsock,buf,1024,MSG_OOB))<0)
{
if(rval==WSAEINPROGRESS)
printf("Hello 1\n");
if(rval==WSAENETRESET)
printf("Hello 2\n");
if(rval==WSAENOTSOCK)
printf("Hello 3\n");
if(rval==WSAEOPNOTSUPP)
printf("Hello 4\n");
perror("reading stream message");
getchar();
exit(1);
}
else if(rval==0)
printf("ending connection\n");
else
printf("--->%s\n",buf);
}while(rval!=0);
//调用函数closesocket()关闭套接口
closesocket(msgsock);
}while(1); WSACleanup(); printf("server stop !\n");
return 0;
}//客户端代码
// client.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "winsock.h"
#include "stdio.h"
#include "stdlib.h"int main(int argc, char* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2,0); int err=WSAStartup(wVersionRequested,&wsaData);
if(err==-1){
perror("WSAStartup");
exit(1);
}
int sock,length,msgsock;
struct sockaddr_in server;
char buf[]="This is test."; sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0){
perror("Opening stream socket");
exit(1);
} server.sin_family=PF_INET;
server.sin_port = htons(7016);
server.sin_addr.s_addr=inet_addr("10.105.200.45");
msgsock=connect(sock,(struct sockaddr*)&server,sizeof(server)); length=sizeof(buf);
//调用send函数发送数据
int rval=send(sock,buf,length,MSG_OOB);
if(rval!=length){
perror("Sending stream error");
getchar();
exit(1);
} closesocket(msgsock);

WSACleanup();
return 0;
}///////////////////////////////请路过的人帮忙看看呀!

解决方案 »

  1.   

    client.cpp:
    server.sin_addr.s_addr=inet_addr("10.105.200.45");//这个IP是否正确?改用
    server.sin_addr.s_addr=inet_addr("127.0.0.1");//用本机IP测试
      

  2.   

    ip就是自己的,而且我已经接收到一个数据,但是buf[0]=0,rval=1显然不是我发送的数据.
      

  3.   

    ((rval=recv(msgsock,buf,1024,MSG_OOB))中MSG_OOB改填0
      

  4.   

    send,recv一般是基于流协议的,不保证一次性发送或接收数据,所以要你自己阻塞。char sendbuff[1024];
    int nBytes = 1024,nLeft,index;
    nLeft = nBytes;
    index = 0;
    while (nLeft > 0)
    {
       ret = send(sock, &sendbuff[index], nLeft, 0)
       nLeft -= ret;
       index += ret;
    }同样,接收数据是也要用循环来保证数据已经全部接收。
      

  5.   

    MSG_OOB,书上写的,我也不知道为什么?请大家告诉我,MSG_OOB有什么用?
      

  6.   

    还有一个问题,为何我发送一次后,就出现 WSAECONNRESET 错误呢?
    是否因为客户端断开连接了?
      

  7.   

    WSAECONNRESET 
    ==客户端强制断开连接。应该是客户端接收有问题。
      

  8.   

    把server和client的MSG_OOB都改成0