请教一个winsock的初级问题,
小弟我刚刚开始学WinAPI的套接字编程,
写了一个C/S模式的通信程序,
为什么我的服务端可以给客户端发送数据包,
但是客户端不能给服务端发送数据包,
而且send函数调用却没有出错,
为什么?怎么解决?
那位高手给个说法,谢谢!

解决方案 »

  1.   

    你要按照步骤来做
    服务器端:WSAStartup(),socket(),listen(),accept()
    客户端:WSAStartup(),socket(),connect()建立连接后才可以发送,这时候最简单的TCP的步骤,多看看书
      

  2.   

    这是我的客户端的源代码,
    向大家求救://main.cpp
    #include<windows.h>
    #include<winsock.h>
    #include "resource.h"bool IsConnect=false;
    char IpAddr[16]="",rBuf[256]="",sBuf[256]="",*stop;
    SOCKET NewS;
    sockaddr_in saddr;
    WSADATA WSAData;
    int Port=2000,MsgLen=0;
    LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    HINSTANCE hComCtl;
    hComCtl=LoadLibrary(TEXT("comctl32.dll")); 
    DialogBox(hInstance,(LPCTSTR)IDD_MAIN,0,(DLGPROC)DlgProc);
    FreeLibrary(hComCtl);
    return 0;
    }LRESULT CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch(message)
    {
    case WM_INITDIALOG:
    SetDlgItemInt(hDlg,IDC_PORT,Port,true);
    SetWindowText(GetDlgItem(hDlg,IDC_IPADDRESS),IpAddr);
    SetWindowText(GetDlgItem(hDlg,IDC_RMSG),rBuf);
    SetWindowText(GetDlgItem(hDlg,IDC_MSG),sBuf);
    break;
    case WM_COMMAND:
    switch(wParam)
    {
    case IDC_CONNECT:
    GetWindowText(GetDlgItem(hDlg,IDC_IPADDRESS),IpAddr,GetWindowTextLength(GetDlgItem(hDlg,IDC_IPADDRESS))+1);
    Port=GetDlgItemInt(hDlg,IDC_PORT,NULL,true);
    // GetWindowText(GetDlgItem(hDlg,IDC_PORT),Port,GetWindowTextLength(GetDlgItem(hDlg,IDC_PORT))+1); if(SOCKET_ERROR==WSAStartup(((0<<8)|2),&WSAData))
    {
    MessageBox(0,"初始化winsock.dll失败!","Error!",MB_OK);
    WSACleanup();
    return 0;
    } NewS=socket(PF_INET,SOCK_STREAM,0); WSAAsyncSelect(NewS,hDlg,WM_SOCK,FD_CONNECT|FD_READ|FD_WRITE); saddr.sin_family=AF_INET;
    saddr.sin_addr.s_addr=inet_addr(IpAddr);
    saddr.sin_port=htons(Port); connect(NewS,(struct sockaddr *)&saddr,sizeof(saddr));
    EnableWindow(GetDlgItem(hDlg,IDC_IPADDRESS),false);
    EnableWindow(GetDlgItem(hDlg,IDC_PORT),false);
    EnableWindow(GetDlgItem(hDlg,IDC_CONNECT),false);
    EnableWindow(GetDlgItem(hDlg,IDC_OFF),true);
    IsConnect=true;
    break;
    case IDC_OFF:
    SendMessage(hDlg,WM_SOCK,0,FD_CLOSE);
    break;
    case IDC_SEND:
    SendMessage(hDlg,WM_SOCK,0,FD_WRITE);
    break;
    }
    break;
    case WM_SOCK:
    switch(lParam)
    {
    case FD_CONNECT:
    // WSAAsyncSelect(NewS,hDlg,WM_SOCK,FD_READ|FD_WRITE|FD_CLOSE);
    EnableWindow(GetDlgItem(hDlg,IDC_MSG),true);
    EnableWindow(GetDlgItem(hDlg,IDC_SEND),true);
    break;
    case FD_READ:
    recv(NewS,rBuf,256,0);
    SetWindowText(GetDlgItem(hDlg,IDC_RMSG),rBuf);
    break;
    case FD_WRITE:
    MsgLen=GetWindowTextLength(GetDlgItem(hDlg,IDC_MSG))+1;
    if(MsgLen>256)MessageBox(0,"对不起!\n您的信息太长,请分两次发送!","Message",MB_OK);
    else 
    {
    GetWindowText(GetDlgItem(hDlg,IDC_MSG),sBuf,MsgLen);
    if(SOCKET_ERROR==send(NewS,sBuf,MsgLen-1,0))MessageBox(0,"发送数据失败!","Message",MB_OK);
    }
    break;
    case FD_CLOSE:
    closesocket(NewS);
    WSACleanup();
    EnableWindow(GetDlgItem(hDlg,IDC_MSG),false);
    EnableWindow(GetDlgItem(hDlg,IDC_SEND),false);
    EnableWindow(GetDlgItem(hDlg,IDC_IPADDRESS),true);
    EnableWindow(GetDlgItem(hDlg,IDC_PORT),true);
    EnableWindow(GetDlgItem(hDlg,IDC_CONNECT),true);
    EnableWindow(GetDlgItem(hDlg,IDC_OFF),false);
    IsConnect=false;
    break;
    }
    break;
    case WM_CLOSE:
    if(IsConnect)MessageBox(0,"请先断开连接!","Message",MB_OK);
    else EndDialog(hDlg,0);
    break;
    }
    return 0;
    }
    上面就是我的代码,为什么会发不出数据包,
    谢谢各位!
      

  3.   

    加//的那两行是我注释掉了的,
    没有去掉,
    不好意思啊,// GetWindowText(GetDlgItem(hDlg,IDC_PORT),Port,GetWindowTextLength(GetDlgItem(hDlg,IDC_PORT))+1);
    // WSAAsyncSelect(NewS,hDlg,WM_SOCK,FD_READ|FD_WRITE|FD_CLOSE);
      

  4.   

    tcp吗?不可能。
    udp可能单通。那就是一边的目的地址错了