有这么复杂吗?给你一段势力代码吧~~~
记得自己初始化SOCKET
struct sockaddr_in svr;
int fd; if ( ( fd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
{
perror("socket");
return 1;
}
p->sock = fd; svr.sin_family = AF_INET;
svr.sin_port = htons( ACD_LISTEN_PORT ); svr.sin_addr.s_addr = inet_addr( ACD_HOST_IP );// printf("connecting to %s...\n", ip );
if ( connect( fd, (struct sockaddr *)&svr, sizeof(svr) ) != 0 ) 

AfxMessageBox("connect to fail." );
return 0;
}
USHORT id = 999;
send( fd, (char*)&id, 2, 0 );

解决方案 »

  1.   

    p->sock = fd;//p是什么结构????
      

  2.   

    问题解决了吗?怎么解决的?我现在也是这样。直接用winsock api 编写的 console程序,connect好了, send 完一个包, recv回应时却没有收到数据,直到 server 把 socket close掉。有没有谁遇到过,怎么解决的?
      

  3.   

    //socket client application connect to daytime protocol server to get time
    #include "stdafx.h"
    #include <winsock2.h>
    #include "io.h"
    #include "stdio.h"
    #include "string.h"
    #include "stdlib.h"#define PROTOPORT 13
    extern int errno;
    char localhost[]="time-a.nist.gov";//default time servervoid main(int argc, char* argv[])
    {
        struct hostent *ptrh;
        struct protoent *ptrp;
        struct sockaddr_in sad;
        int sd;
        int port;
        char *host;
        int n;
        char buf[1000];
        printf("Program started\n");
        WSADATA wsaData;
        WSAStartup(0x0101,&wsaData);
        memset((char *) &sad,0,sizeof(sad));
        sad.sin_family=AF_INET;
        if(argc>2)
            port = atoi(argv[2]);
        else
            port = PROTOPORT;
        if(port>0)
            sad.sin_port=htons((u_short)port);
        else
        {
            fprintf(stderr,"bad port number %s\n",argv[2]);
            exit(1);
        }    if(argc>1)
            host = argv[1];
        else
            host= localhost;    ptrh = gethostbyname(host);
    if(ptrh==NULL)
        {
            fprintf(stderr,"invalid host:%s\n",host);
            exit(1);
        }
    printf("Host:%s,Port number:%d\n",host,port);
        memcpy(&sad.sin_addr,ptrh->h_addr_list[0],ptrh->h_length);
    // or you can use IP address sad.sin_addr.s_addr = inet_addr("129.6.15.28");
        if( ((ptrp=getprotobyname("tcp"))) ==NULL)
        {
            fprintf(stderr,"cannot map \"tcp\" to protocol number");
            exit(1);
        }    sd = socket(AF_INET,SOCK_STREAM,0);//ptrp->p_proto
        if(sd<0)
        {
            fprintf(stderr,"socket creation error\n");
            exit(1);
        }
        else
            printf("sd=%d",sd);
        if(connect(sd,(sockaddr*)&sad,sizeof(sockaddr_in ))!=0)
        {
            fprintf(stderr,"connect failed\n");
            exit(1);
        }
        n = recv(sd,buf,sizeof(buf),0);
        while(n>0)
        {
            _write(1,buf,n);
            n= recv(sd,buf,sizeof(buf),0);
        }
        closesocket(sd);
              exit(0);
    }
      

  4.   

    你设置server变量那一段太麻烦,可以写以下三句就行了:server.sin_family = AF_INET;
    server.sin_port = htons(6000);
    server.sin_addr.s_addr = inet_addr("192.168.2.4");另外,你说的能连通,不能通讯是不能读呢还是不能写?具体在哪一条错误??
      

  5.   

    上面这段代码指出了问题的关键
        n = recv(sd,buf,sizeof(buf),0);
        while(n>0)
        {
            _write(1,buf,n);
            n= recv(sd,buf,sizeof(buf),0);
        }
    我再简单解释一下:
    1. TCP是流式的,它传送的byte stream. 所以接收方recv(...)调一次可能只接收一个字节,也可接收多个字节
    2. 所以必须循环调
    3. 当这个socket被对方close()时, recv(...)返回0
    4. 当这个socket被对方错误时, recv(...)返回<0
      

  6.   

    sorry, 看走眼了,刚才是我程序自己的错误,不是通信问题。好了。这样编程是可以通的,虽然socket 处理比较简单。