基于
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
客户端代码
|
声明部分
|
|
实现代码
|
|