新手,试用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) ;

}
...全文
219 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
su47flying 2006-09-19
  • 打赏
  • 举报
回复
void CSendFileDlg::OnButtonStart()
{
// TODO: Add your control notification handler code here
//初始化与绑定服务器
WSADATA wsaData;
int iErrorCode;
if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
{
GetDlgItem(IDC_EDIT_RECV)->SetWindowText("Winsock无法初始化!");
WSACleanup();
return;
}

GetDlgItem(IDC_EDIT_RECV)->SetWindowText("服务器开始创建SOCKET");

m_ServerSocket=socket(PF_INET,SOCK_STREAM,0); //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信

if(m_ServerSocket == INVALID_SOCKET)
{
GetDlgItem(IDC_EDIT_RECV)->SetWindowText("无法创建服务器socket!");
return;
}

m_sockServerAddr.sin_family = AF_INET;
m_sockServerAddr.sin_addr.s_addr = INADDR_ANY; //向所有的IP地址发送消息
m_sockServerAddr.sin_port = htons(8001);

if (bind(m_ServerSocket,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
{
GetDlgItem(IDC_EDIT_RECV)->SetWindowText("无法绑定服务器。");
return;
}

GetDlgItem(IDC_EDIT_RECV)->SetWindowText("服务器端口:8001.");

iErrorCode=WSAAsyncSelect(m_ServerSocket,m_hWnd,WM_CLIENT_ACCEPT,FD_ACCEPT);
// 产生相应传递给窗口的消息为WM_SERVER_ACCEPT ,这是自定义消息

if (iErrorCode == SOCKET_ERROR)
{
GetDlgItem(IDC_EDIT_RECV)->SetWindowText("WSAAsyncSelect设定失败!——用于连接请求的消息");
return;
}

if (listen(m_ServerSocket,1) == SOCKET_ERROR) //开始监听客户连接请求
{
GetDlgItem(IDC_EDIT_RECV)->SetWindowText("服务器监听失败!");
return;
}

GetDlgItem(IDC_EDIT_RECV)->SetWindowText("服务器绑定监听成功。");
GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);
return;
}

LRESULT CSendFileDlg::OnAccept(WPARAM wParam,LPARAM lParam)
{
//自定义接收客户机请求的消息 ON_MESSAGE(WM_CLIENT_ACCEPT,OnAccept)
if (WSAGETSELECTERROR(lParam))
{
GetDlgItem(IDC_EDIT_RECV)->SetWindowText("Error detected on entry into OnServerAccept.");
return 0L;
}

if(WSAGETSELECTEVENT(lParam) == FD_ACCEPT)//如果
{
m_Client = accept(m_ServerSocket,(LPSOCKADDR)&m_sockServerAddr,0);

if (m_Client == INVALID_SOCKET)
{
GetDlgItem(IDC_EDIT_RECV)->SetWindowText("Server socket failed to accept connection.");
return 0L;
}
WSAAsyncSelect(m_Client,m_hWnd,WM_CLIENT_READCLOSE,FD_READ|FD_CLOSE);
}

GetDlgItem(IDC_EDIT_RECV)->SetWindowText("有工作站连接上了服务器。");
GetDlgItem(IDC_SEND_FILE)->EnableWindow(TRUE);
return 0;
}
cylm 2006-09-19
  • 打赏
  • 举报
回复
sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
放错位置了……

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧