流程:
client: WSAStartup() -> socket() -> connect() _-> write()
server: WSAStartup() -> socket() -> bind()-> listen() -> accept() -> read()
其他都很简单
有问题看MSDN
client: WSAStartup() -> socket() -> connect() _-> write()
server: WSAStartup() -> socket() -> bind()-> listen() -> accept() -> read()
其他都很简单
有问题看MSDN
解决方案 »
- 关于 SHGetKnownFolderPath 的使用问题
- XP 锁定或者Logon的时候,窗口查找问题。
- sdi工程里关闭模式对话框时整个程序退出,为什么呀?
- 如何将CGridCtrl 中的记录与 Edit 中的数据显示关联起来?
- 为什么同一程序在中文xp和英文xp下运行界面不一致??
- GetUdpStatistics 函数
- 我使用了虚函数,为什么输出了 30 而不输出 11 呢?
- 用winsock编程,如果连接另一方网线断了,或电源掉电,怎么才能监测到?
- 远程控制协议
- 高手请进,在线等待!
- 向各位大侠请教关于WINDOWS可执行程序中CRC(程序完整性校验)的问题.
- 在VC中如何将一个字符串(“20020404”)插入到数据库某表中的DateTime类型字段中去,该SQL语句如何来写
我要完整的!
编程的流程我知道!
我可以用Console程序实现!
但用Windows程序却实现不了!
所以我要完整的代码,看看细节!
请大家帮帮忙!
你的来信我收到了!
我不懂MFC,只会API
很谢谢你的帮助!
有没有API 的代码,越简单越好!
你有点MFC基础就可以看得懂
好的,我劲力看看!
有什么问题再问你!
希望别介意!
只能给你发这么点(服务端程序)
而且很简要,希望能对你有帮助,
但你要知道SOCKET中WSAAsyncSelect模型才可以看得懂#define WM_SOCKET WM_USER+1
...int WINAPI WinMain(...)
{
SOCKET listen;
SOCKADDR_IN InternetAddr
HWND Window; Window=CreateWindow()
listen=Socket(); InternetAddr.sin_family=AF_INET;
InternetAddr.sin_addr.s_addr=htol(INADDR_ANY); bind(listen,(PSOCKADDR)&InternetAddr,sizeof(nternetAddr)); WSAAsyncSelec(listen,Window,WM_SOCKET,
FD_ACCEPT|FD_CLOSE|FD_READ|FD_WRITE);
listen(listen,5);}bool CALLBACK WindowProc(...)
{
SOCKET accept;
switch(wMsg)
{
case WM_CREATE:
...
break;
case WM_SOCKET:
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
break;
case FD_READ:
break;
case FD_WRITE:
break;
case FD_CLOSE:
break;
}
}
SOCKET s;
struct sockaddr_in addr;
int iResult;
long lResult;
char strSubAddr[2024], strBuffer[100];
lResult = WSAStartup(0x0101,&ws);
s = socket(AF_INET,SOCK_STREAM,0);
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr ("127.0.0.1");
iResult=connect(s,(struct sockaddr *) &addr, sizeof(addr));
if(SOCKET_ERROR == iResult)
{
// 连接失败
WSACleanup();
return FALSE;
}
// 连接成功
strcpy(strSubAddr, "hello world");
iResult = send(s, strSubAddr,strlen(strSubAddr),0);
strset(strBuffer,' ');
iResult = recv(s,strBuffer,sizeof(strBuffer),0); WSACleanup();
明天我把我的代码贴上来,
你帮我看看!
也请大家帮忙!
你的程序没体现出窗口过程
wengyu1000:
明天来吧
请大家帮忙看看,有什么问题
谢谢!
/*------------------------------------------------------------
服务器端代码,接受一个“hello”,并用TextOut()显示
------------------------------------------------------------*/#include <windows.h>
#include <stdio.h>
#include <string.h>
#define WM_SOCKET (WM_USER + 1)
SOCKET servAccept;LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
SOCKET servListen;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ; WSADATA wsaData;
int err;
struct sockaddr_in localAddr; 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 (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
200, // initial x position
200, // initial y position
200, // initial x size
200, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ; //初始化套接字
err= WSAStartup (MAKEWORD (2, 2), &wsaData);
if(err!=0)
{
MessageBox (NULL,"初始化套阶字失败","err",0);
return FALSE;
}
//创建服务端套阶字
servListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(servListen==INVALID_SOCKET)
{
MessageBox(NULL,"创建套阶字失败","err",0);
WSACleanup();
return FALSE;
}
//绑定到本地的一个断口上
localAddr.sin_family=AF_INET;
localAddr.sin_port=htons(1000);
localAddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.167");
//这是我机器的IP
if(bind(servListen,(struct sockaddr *)&localAddr,
sizeof(localAddr))==SOCKET_ERROR)
{
MessageBox(NULL,"地址绑定失败","err",0);
WSACleanup();
return FALSE;
} //调用WSAAsyncSelect()函数
err = WSAAsyncSelect (servListen, hwnd, WM_SOCKET, FD_ACCEPT | FD_CLOSE);
if(err != 0)
{
MessageBox( NULL, "调用WSAAsyncSelect()失败","err",0);
} //侦听客户端的连接
listen(servListen,5);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ; TCHAR Buffer[10];
int retval ,fromlen;
struct sockaddr_in fromAddr;
switch (message)
{
case WM_SOCKET:
if ( WSAGETSELECTERROR(lParam))
{
closesocket( wParam);
break;
} switch(WSAGETSELECTEVENT (lParam))
{
case FD_ACCEPT:
// 接受连接
fromlen=sizeof(fromAddr);
servAccept = accept (wParam, (struct sockaddr*)&fromAddr,
&fromlen); //调用WSAAsyncSelect()函数
WSAAsyncSelect (servAccept, hwnd, WM_SOCKET, FD_READ | FD_CLOSE);
break; case FD_READ:
//接受数据并打印出来
retval = recv (servAccept,Buffer,sizeof(Buffer),0); if(retval != 0)
MessageBox(NULL,"OK","ok",0); hdc = GetDC(hwnd);
TextOut(hdc, 0, 0, TEXT(Buffer), strlen (Buffer ));
ReleaseDC(hwnd, hdc );
break; case FD_CLOSE:
closesocket (wParam);
break;
} return 0;
case WM_DESTROY:
closesocket(servListen);
WSACleanup();
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
客户端代码,传输一个"hello"给服务器,并用TextOut()显示
------------------------------------------------------------*/#include <windows.h>
#include <stdio.h>
#include <string.h>
#define WM_SOCKET (WM_USER + 1)LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
SOCKET clientSocket;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
WSADATA wsaData;
int err; 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 (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
500, // initial x position
500, // initial y position
200, // initial x size
200, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ; //初始化套接字
err= WSAStartup (MAKEWORD (2, 2), &wsaData);
if(err!=0)
{
MessageBox (NULL,"初始化套阶字失败","err",0);
return FALSE;
}
//创建客户端套阶字
clientSocket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(clientSocket==INVALID_SOCKET)
{
MessageBox(NULL,"创建套阶字失败","err",0);
WSACleanup();
return FALSE;
}
//调用WSAAsyncSelect()函数
err = WSAAsyncSelect (clientSocket, hwnd, WM_SOCKET, FD_CONNECT | FD_CLOSE | FD_WRITE );
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
TCHAR Buffer[] = "HELLO";
int retval;
struct sockaddr_in conAddr;
switch (message)
{
case WM_SOCKET:
if ( WSAGETSELECTERROR(lParam))
{
closesocket( wParam);
break;
} switch(WSAGETSELECTEVENT (lParam))
{
case FD_CONNECT:
// 请求连接
conAddr.sin_family=AF_INET;
conAddr.sin_port=htons(1000);
conAddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.167");
//这是我机器的IP
connect ( clientSocket, ( struct sockaddr *) &conAddr,
sizeof(conAddr)); break; case FD_WRITE:
//传送数据并打印出来
retval = send ( clientSocket, Buffer,sizeof(Buffer),0);
hdc = GetDC(hwnd);
TextOut(hdc, 0, 0, TEXT(Buffer), strlen (Buffer ));
ReleaseDC(hwnd, hdc ); break; case FD_CLOSE:
closesocket (wParam);
break;
} return 0;
case WM_DESTROY:
closesocket(clientSocket);
WSACleanup();
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
client.c
#include "WINSOCK.H"
#include <stdio.h>
#define DATA "half a league, half a league..."main (argc, argv)
int argc;
char *argv[];
{
int sock;
struct sockaddr_in server;
struct hostent *hp;//, *gethostbyname();
char buf[1024]; WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) return 0; sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
perror("opening stream socket");
exit(1);
} server.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
if (hp == 0)
{
fprintf(stderr, "%s: unknown host\n", argv[1]);
exit(2);
} memcpy((char*)&server.sin_addr, (char*)hp->h_addr, hp->h_length);
server.sin_port = htons(atoi(argv[2])); if (connect( sock, (struct sockaddr*)&server, sizeof(server)) < 0)
{
perror("connectiong stream socket");
exit(3);
}
if (send( sock, DATA, sizeof(DATA), 0) < 0)
perror("sending on stream socket");
closesocket(sock); WSACleanup();
exit(0);
}server.c//#include <afx.h>
#include <winsock.h>
//#include <windows.h>
#include <stdio.h>
#define TRUE 1main()
{
int sock, length;
struct sockaddr_in server;
//struct sockaddr tcpaddr;
int msgsock;
char buf[1024];
int rval, len;
int err1; WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) return 0;
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0){
perror(" opening stream socket ");
exit(1);
}
//SockAddr.sin_family = AF_INET;
//SockAddr.sin_addr.s_addr = INADDR_ANY;
//SockAddr.sin_port = ::htons(nPort);
server.sin_family = AF_INET;
server.sin_addr.S_un.S_addr = INADDR_ANY;
server.sin_port = 4000; //server.sin_addr.S_un.S_addr = "192.168.111.77";
if (bind (sock, (struct sockaddr*) &server, sizeof(server)) == SOCKET_ERROR){
perror(" binding stream socket ");
err1 = GetLastError();
exit(1);
} length = sizeof(server);
if (getsockname(sock, (struct sockaddr*)&server, &length) == SOCKET_ERROR){
perror(" getting socket name");
err1 = GetLastError();
exit(1);
} printf("socket port # %d\n", ntohs(server.sin_port));
listen(sock, 5);
len = sizeof(struct sockaddr);
do{
msgsock = accept(sock, (struct sockaddr*) &server, (int*)&len);
if (msgsock == -1)
perror("accept");
else do{
memset(buf, 0, sizeof(buf));
if ((rval = recv( msgsock, buf, 1024, 0)) < 0)
perror("reading stream message");
if (rval == 0)
printf("ending connection\n");
else
printf("-->%s\n",buf);
}while(rval != 0);
closesocket(msgsock);
}while(TRUE); WSACleanup();
exit(0);
}
connect ( clientSocket, ( struct sockaddr *) &conAddr,
sizeof(conAddr));
函数怎么能在FD_CONNECT:下调用呢,应在WINMAIN()中才对,
还有,retval = send ( clientSocket, Buffer,sizeof(Buffer),0);
函数也不能在FD_WRITE:下调用FD_CONNECT消息是在你调用CONNECT()之后,得到服务器的ACCEPT()时才会
产生的,也就是说FD_CONNECT仅用来检验是否连接上服务器SEND应由外部事件触发(如点击按钮),产生FD_WRITE仅意味着你可以发送消息
:作为一个应用程序,自收到首条FD_WRITE消息开始,便可以发送数据,直到一个SEND返回WSAEWOULDBLOCK错误,经过这个失败后,要再另一条FD_WRITE通知应用程序才能再次发送数据
你好,我真的很笨
你能不能改一改我的代码,实现功能。
最好是能过响应FD_CONNECT,FD_WRITE消息
我对FD_WRITE还不是很理解
万分感谢!