请教一个winsock的初级问题,
小弟我刚刚开始学WinAPI的套接字编程,
写了一个C/S模式的通信程序,
为什么我的服务端可以给客户端发送数据包,
但是客户端不能给服务端发送数据包,
而且send函数调用却没有出错,
为什么?怎么解决?
那位高手给个说法,谢谢!
小弟我刚刚开始学WinAPI的套接字编程,
写了一个C/S模式的通信程序,
为什么我的服务端可以给客户端发送数据包,
但是客户端不能给服务端发送数据包,
而且send函数调用却没有出错,
为什么?怎么解决?
那位高手给个说法,谢谢!
服务器端:WSAStartup(),socket(),listen(),accept()
客户端:WSAStartup(),socket(),connect()建立连接后才可以发送,这时候最简单的TCP的步骤,多看看书
向大家求救://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;
}
上面就是我的代码,为什么会发不出数据包,
谢谢各位!
没有去掉,
不好意思啊,// GetWindowText(GetDlgItem(hDlg,IDC_PORT),Port,GetWindowTextLength(GetDlgItem(hDlg,IDC_PORT))+1);
// WSAAsyncSelect(NewS,hDlg,WM_SOCK,FD_READ|FD_WRITE|FD_CLOSE);
udp可能单通。那就是一边的目的地址错了