100求c的socket通讯方面的文章或者例子
多谢 问题点数:0、回复次数:5Top
1 楼MCR()回复于 2004-12-01 18:45:14 得分 0
网上搜索很多的Top
2 楼DuoFG(多非光)回复于 2004-12-01 18:57:44 得分 0
/*
* TCP Stream Socket Client
* 这个例子说明了如何实现一个Winsock的客户端。
* 它做的工作非常简单,负责发送一条消息到服务器,并且接收从服务器的返回信息。
* 如果指定服务器名为"localhost",这个程序和TCP Stream Socket Server这个例子运行在同一台机器上。
* 也可以通过指定其他服务器名来在不同的机器上工作。
*/
#include <windows.h>
#include <winsock.h>
#define PORTNUM 5000 // 端口号
#define HOSTNAME "localhost" // 服务器名字
// 根据服务器的不同,更改上面的名字
int WINAPI WinMain (
HINSTANCE hInstance, // 实例句柄
HINSTANCE hPrevInstance,// NULL
LPTSTR lpCmdLine, // 用于运行程序的命令行
int nCmdShow) // 程序的最初的显示方式
{
int index = 0, // 索引
iReturn; // recv函数的返回值
char szClientA[100]; // ASCII码串
TCHAR szClientW[100]; // Unicode串
TCHAR szError[100]; // 出错消息串
SOCKET ServerSock = INVALID_SOCKET; // 服务器的socket
SOCKADDR_IN destination_sin; // 服务器的socket地址
PHOSTENT phostent = NULL; // 指向服务器的HOSTENT结构
WSADATA WSAData; // 包含了Winsocket执行后的细节
// 初始化Winsocket.
if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0)
{
wsprintf (szError, TEXT("WSAStartup failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return FALSE;
}
// 创建一个绑定服务器的TCP/IP socket
if ((ServerSock = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
wsprintf (szError, TEXT("Allocating socket failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return FALSE;
}
// 把服务器的socket的地址信息填入
destination_sin.sin_family = AF_INET;
// 通过主机名取得主机信息
if ((phostent = gethostbyname (HOSTNAME)) == NULL)
{
wsprintf (szError, TEXT("Unable to get the host name. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}
// 分配socket IP地址
memcpy ((char FAR *)&(destination_sin.sin_addr),
phostent->h_addr,
phostent->h_length);
// 转化端口字段为大终点
destination_sin.sin_port = htons (PORTNUM);
// 建立一个到服务器socket的连接.
if (connect (ServerSock,
(PSOCKADDR) &destination_sin,
sizeof (destination_sin)) == SOCKET_ERROR)
{
wsprintf (szError,
TEXT("Connecting to the server failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}
// 向服务器发送信息
if (send (ServerSock, "To Server.", strlen ("To Server.") + 1, 0)
== SOCKET_ERROR)
{
wsprintf (szError,
TEXT("Sending data to the server failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
}
// 禁止服务器接收信息
shutdown (ServerSock, 0x01);
for (;;)
{
// 从服务器接收信息
iReturn = recv (ServerSock, szClientA, sizeof (szClientA), 0);
// 如果接收到服务器信息,显示之
if (iReturn == SOCKET_ERROR)
{
wsprintf (szError, TEXT("No data is received, recv failed.")
TEXT(" Error: %d"), WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Client"), MB_OK);
break;
}
else if (iReturn == 0)
{
MessageBox (NULL, TEXT("Finished receiving data"), TEXT("Client"),
MB_OK);
break;
}
else
{
// 把ASCII码字符串转换成Unicode码字符串
for (index = 0; index <= sizeof (szClientA); index++)
szClientW[index] = szClientA[index];
// 显示从服务器接收到的字符串
MessageBox (NULL, szClientW, TEXT("Received From Server"), MB_OK);
}
}
// 禁止服务器发送信息
shutdown (ServerSock, 0x00);
// 关闭服务器socket.
closesocket (ServerSock);
WSACleanup ();
return TRUE;
}Top
3 楼DuoFG(多非光)回复于 2004-12-01 18:57:57 得分 0
#include "windows.h"
#include "winsock.h"
#include "resource.h"
#include "PROCESS.H"
#define STATUS_SEND 0
#define STATUS_REVE 1
#define STATUS_DONE 2
#define WM_MESSAGE_REVED (WM_USER+0)
#define WM_MESSAGE_SENDED (WM_USER+1)
#define PORTNUM 5000 // 端口号
#define HOSTNAME "localhost" // 服务器名字
// 根据服务器的不同,更改上面的名字
typedef struct
{
HWND hwnd;
BOOL bContinue;
SOCKET ServerSock;
}
PARAMS,*PPARAMS;
// === Function Prototypes ====================================================
BOOL WINAPI MainDlgProc( HWND, UINT, WPARAM, LPARAM );
void NetworkThread(PVOID pvoid);
// === Global Variables =======================================================
HINSTANCE hInst;
char szClientA[100]; // ASCII码串
TCHAR szClientW[100]; // Unicode串
TCHAR szSendBuffer[100];
TCHAR szError[100]; // 出错消息串
// === Application Entry Point ================================================
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd,
int nShow )
{
WNDCLASS wc;
GetClassInfo( NULL, WC_DIALOG, &wc ); // Get dialog box class info
wc.hInstance = hInstance;
wc.lpszClassName = "Client"; // so's we can superclass it
wc.lpfnWndProc = DefDlgProc; // all this for an icon...sheesh
wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( 100 ) );
wc.cbWndExtra = DLGWINDOWEXTRA;
if( ! RegisterClass( &wc ) ) // Quit if registration fails
return( FALSE );
hInst = hInstance; // Now just start the main dialog and exit
DialogBox( hInstance, MAKEINTRESOURCE(ID_CLIENT), NULL, MainDlgProc );
return( FALSE );
}
// === Main Dialog Box ========================================================
BOOL WINAPI MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
static SOCKET ServerSock = INVALID_SOCKET; // 服务器的socket
static SOCKADDR_IN destination_sin; // 服务器的socket地址
static PHOSTENT phostent = NULL; // 指向服务器的HOSTENT结构
static WSADATA WSAData; // 包含了Winsocket执行后的细节
static PARAMS params;
switch( msg )
{
case WM_INITDIALOG:
{
if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0)
{
wsprintf (szError, TEXT("WSAStartup failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return FALSE;
}
return 0;
}
case WM_PAINT: // Paint dialog box background COLOR_BTNFACE
{
PAINTSTRUCT ps;
HDC hDC;
RECT Rect;
hDC = BeginPaint( hDlg, &ps );
GetClientRect( hDlg, &Rect );
FillRect( hDC, &Rect, GetProp( hDlg, "BRUSH" ) );
EndPaint( hDlg, &ps );
return 0;
}
case WM_MESSAGE_REVED:
{
SetWindowText( GetDlgItem(hDlg,IDC_EDIT1), szClientW );
return 0;
}
case WM_COMMAND:
{
if( wParam == IDC_CONNECT ) // 连接服务器
{
if ((ServerSock = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
wsprintf (szError, TEXT("Allocating socket failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return FALSE;
}
// 把服务器的socket的地址信息填入
destination_sin.sin_family = AF_INET;
// 通过主机名取得主机信息
if ((phostent = gethostbyname (HOSTNAME)) == NULL)
{
wsprintf (szError, TEXT("Unable to get the host name. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}
// 分配socket IP地址
memcpy ((char FAR *)&(destination_sin.sin_addr),
phostent->h_addr,
phostent->h_length);
// 转化端口字段为大终点
destination_sin.sin_port = htons (PORTNUM);
// 建立一个到服务器socket的连接.
if (connect (ServerSock,
(PSOCKADDR) &destination_sin,
sizeof (destination_sin)) == SOCKET_ERROR)
{
wsprintf (szError,
TEXT("Connecting to the server failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}
params.hwnd = hDlg;
params.bContinue = TRUE;
params.ServerSock = ServerSock;
_beginthread(NetworkThread,0,¶ms);
}
else if(wParam == IDC_SEND )
{
GetWindowText(GetDlgItem(hDlg,IDC_EDIT),
szSendBuffer,GetWindowTextLength(GetDlgItem(hDlg,IDC_EDIT)));
if (send (ServerSock, szSendBuffer, strlen (szSendBuffer) + 1, 0)
== SOCKET_ERROR)
{
wsprintf (szError,
TEXT("Sending data to the server failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
}
}
else if(wParam == IDCANCEL)
{
EndDialog( hDlg, TRUE );
}
return( TRUE );
}
}
return FALSE;
}
// End of MainDlgProc()
void NetworkThread(PVOID pvoid)
{
volatile PPARAMS pparams;
int index = 0, // 索引
iReturn; // recv函数的返回值
pparams = (PPARAMS)pvoid;
for (;;)
{
// 从服务器接收信息
iReturn = recv (pparams->ServerSock, szClientA, sizeof (szClientA), 0);
// 如果接收到服务器信息,显示之
if (iReturn == SOCKET_ERROR)
{
wsprintf (szError, TEXT("No data is received, recv failed.")
TEXT(" Error: %d"), WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Client"), MB_OK);
break;
}
else if (iReturn == 0)
{
MessageBox (NULL, TEXT("Finished receiving data"), TEXT("Client"),
MB_OK);
break;
}
else
{
// 把ASCII码字符串转换成Unicode码字符串
for (index = 0; index <= sizeof (szClientA); index++)
szClientW[index] = szClientA[index];
// 显示从服务器接收到的字符串
// MessageBox (NULL, szClientW, TEXT("Received From Server"), MB_OK);
SendMessage(pparams->hwnd,WM_MESSAGE_REVED,0,0);
}
}
// 禁止服务器发送信息
shutdown (pparams->ServerSock, 0x00);
// 关闭服务器socket.
closesocket (pparams->ServerSock);
WSACleanup ();
}
Top
4 楼zhouhuaikun(怀空)回复于 2004-12-01 19:26:55 得分 0
dingTop
5 楼sw_man()回复于 2004-12-01 19:51:08 得分 0
最近在搞WEB服务器,看到LINUX中有用SOCKET建立TCP和UDP连接的c代码,网上很多.TCP/IP详解中也有讲到,但重在理论,建议看看.... :0Top
相关问题
- 请提供一个关于c#实现的socket的网络通讯的例子
- C#下类似CSocket得类是哪个?C#程序如何通讯?哪儿有网络通讯得例子
- 谁能给我一个Socket通讯的例子
- 一个Socket通讯例子程序的疑惑!
- 高分请教:那有在C#里用MSCOMM32做串口通讯的例子???
- 求java socket(作客户端)与vc socket(作服务端)通讯的例子!
- 寻求SOCKET TCP C/S 长连接的例子!!!!
- ××××××××求Delphi5中用标准SOCKET控件进行多线程通讯的例子×××××××
- SCO UNix 的 c/c++ 编译器哪儿有? 带socket的例子哪儿有?
- 关于C++和Java用Socket进行通讯的问题?




