新手,试用API写一个最简单的socket程序,遇到问题了,应该是连接问题……
cylm 2006-09-15 11:14:36 在Srv.cpp中
case WM_COMMAND :
send(sockConn,sendbuff,strlen(sendbuff)+1,0);
sprintf(errorbuff,"%ld",WSAGetLastError());
MessageBox(NULL,errorbuff,"listen:srv",0);
return 0;
会弹出WSAENOTSOCK的错误,是不是没连上?该怎么改?其他还有没有错?能否也
帮改改?
///////////////////////////////Srv.cpp//////////////////////////
#include <windows.h>
#include <stdlib.h>
#include <Winsock.h>
#include <String.h>
#include <stdio.h>
#define WM_SOCKET WM_USER+100
char sendbuff[]={"XXXXXXXX123456789"};
char recvbuff[10];
DWORD wVersionRequested;
WSADATA wsaData;
SOCKADDR_IN addrSrv;
SOCKADDR_IN addrClient;
int len=0;
SOCKET sockSrv=0;
SOCKET sockConn=0;
char errorbuff[10]={"ERROR"};
DWORD WINAPI ThreadProc(LPVOID lpParameter);
LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain ( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
//////////////////////////注册窗口//////////////////////////////////////
static char AppName[]="wSRV";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
int iScreenWide;
iScreenWide=GetSystemMetrics (SM_CXFULLSCREEN);
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject (GRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = AppName;
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
if(!RegisterClassEx (&wndclass)) return FALSE;
///////////////////////////创建窗口//////////////////////////////////////////
hwnd =CreateWindow (AppName,
"服务端",
WS_MINIMIZEBOX|WS_SYSMENU ,
100, 100,
100, 100,
NULL, NULL,
hInstance,
NULL );
if(!hwnd) return FALSE;
ShowWindow (hwnd,iCmdShow);
UpdateWindow (hwnd);
/////////////////////////////消息循环///////////////////////////////////////////
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc ( HWND hwnd,
UINT iMsg,
WPARAM wParam,
LPARAM lParam )
{
HWND hButton;
switch (iMsg)
{
case WM_CREATE:
hButton =CreateWindow ( TEXT("button"),"发送",
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
10, 10,50, 30, hwnd, NULL,
((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
wVersionRequested=MAKEWORD(1,1);
if(WSAStartup(wVersionRequested,&wsaData)!=NO_ERROR)
{
MessageBox(0,"加载套接字失败!","错误",MB_OK);
return 0;
}
if(HIBYTE(wsaData.wVersion)!=1||
LOBYTE(wsaData.wVersion)!=1)
{
MessageBox(0,"加载套接字版本错误!","错误",MB_OK);
return 0;
}
sockSrv=socket(AF_INET,SOCK_STREAM,0);
WSAAsyncSelect(sockSrv,hwnd, WM_SOCKET, FD_ACCEPT|FD_READ|FD_WRITE|FD_CONNECT|FD_CLOSE);
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6050);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
len=sizeof(SOCKADDR);
sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
return 0;
case WM_COMMAND :
send(sockConn,sendbuff,strlen(sendbuff)+1,0);
sprintf(errorbuff,"%ld",WSAGetLastError());
MessageBox(NULL,errorbuff,"listen:srv",0);
return 0;
case WM_SOCKET:
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
return 0;
case FD_READ:
recv(sockConn,recvbuff,strlen(recvbuff),1);
if(WSAGetLastError()==WSAENOTSOCK)
MessageBox(NULL,"NOTSOCK","FD_READ:SRV",0);
MessageBox(NULL,recvbuff,"srv接收到的",0);
return 0;
case FD_CONNECT:
MessageBox(NULL,"FD_CONNECT","srv",0);
MessageBox(NULL,"与客户端连接成功!","SRV",0);
return 0;
case FD_CLOSE:
MessageBox(NULL,"FD_CLOSE","srv",0);
return 0;
default:
return 0;
}
return 0;
case WM_CLOSE:
if(MessageBox(0,"确定退出?","警告",MB_OKCANCEL)==1)
{
closesocket(sockSrv);
WSACleanup();
PostQuitMessage (0) ;
}
else
return 0 ;
return 0;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}