基于WinSocket的单线程Client的实现
功能描述:
建立与Socket服务器之间的连接,向服务器端发送数据,并接收来自服务器端的数据。分别以C++和Pascal语言实现。并利用Winsock实现不同编程语言之间的通讯。
调用顺序:
l WSAStartup:开始对WS2_32.dll的使用
l socket:创建一个socket。
l connect:连接至服务器。
l send:向指定socket发送数据。
l recv:从指定的socket接收数据。
l WSACleanup:关闭对WS2_32.dll的使用。
函数说明:
以上函数大部分说明可以参考《基于WinSocket的单线程Server的实现》。
- int connect(
- SOCKET s,
- const struct sockaddr* s,
- const struct sockaddr* name,
- int namelen
- );
功能:建立指定socket的连接。
- if (connect(m_socket,(SOCKADDR*)(&ClientService),sizeof(ClientService)) ==SOCKET_ERROR) {
- cout << "Error on connect" << endl;
- WSACleanup();
- return 1;
- }
注:
1. delphi中对Winsock函数声明位于WinSock.pas文件中,而不是在WinSock2.pas,这与C++中的包含文件Winsock2.h不同。
2. delphi发送char数据时,指定send的第一个参数为szSendBuf[0]。
3. delphi发送string数据时,指定send的第一个参数为szSendBuf[1]。
客户端完整代码:
- // zWinsockClient.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <WinSock2.h>
- #include <Windows.h>
- #include <iostream>
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- //Initialize Winsock
- WSAData wsaData;
- int iResult = WSAStartup(MAKEWORD(2,2),&wsaData);
- if (iResult != NO_ERROR) {
- cout << "Error on WSAStartup " <<endl;
- return 1;
- }
- //Creating a socket
- SOCKET m_socket;
- m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
- if (m_socket == INVALID_SOCKET) {
- cout << "Error on socket " << WSAGetLastError() << endl;
- return 1;
- }
- sockaddr_in ClientService;
- ClientService.sin_family = AF_INET;
- ClientService.sin_addr.s_addr = inet_addr("127.0.0.1");
- ClientService.sin_port = htons(27002);
- if (connect(m_socket,(SOCKADDR*)(&ClientService),sizeof(ClientService)) ==SOCKET_ERROR) {
- cout << "Error on connect" << endl;
- WSACleanup();
- return 1;
- }
- //Send & receive data
- int nSendBytes;
- int nRecvBytes = SOCKET_ERROR;
- char pSendBuf[32] = "Client:Send data";
- char pRecvBuf[32] = "";
- nSendBytes = send(m_socket,pSendBuf,strlen(pSendBuf),0);
- cout << "Num of Send data: " << nSendBytes << endl;
- /*while (nRecvBytes == 0 ||
- (nRecvBytes == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))*/ {
- Sleep(5000);
- nRecvBytes = recv(m_socket,pRecvBuf,32,0);
- if (nRecvBytes == -1) {
- cout << "Connection Close" << endl;
- //break;
- }
- if (nRecvBytes < 0) {
- return 1;
- }
- cout << "Num of Recv data: " << nRecvBytes << endl;
- cout << pRecvBuf << endl;
- }
- WSACleanup();
- return 0;
- }
|
delphi实现的Winsock客户端代码
|
|
声明部分
|
|
|
实现代码
|
|
WinSocket单线程客户端实现
本文介绍如何使用WinSocket在C++及Pascal中实现单线程客户端,包括初始化Winsock、创建套接字、连接服务器、发送及接收数据等步骤。提供了完整的客户端代码示例。
2133

被折叠的 条评论
为什么被折叠?



