实现socket通信文档格式.docx
- 文档编号:18240176
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:23
- 大小:27.85KB
实现socket通信文档格式.docx
《实现socket通信文档格式.docx》由会员分享,可在线阅读,更多相关《实现socket通信文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
Sendersender=newSender(socket);
Threadthread1=newThread(sender);
Receiverreceiver=newReceiver(socket);
Threadthread2=newThread(receiver);
我们来亲自动手实现案例
实现客户端
viewplaincopytoclipboardprint?
1./*
头文件
*/
2.#include
<
stdio.h>
3.#include
"
winsock2.h"
4./*
常量
5.#define
RECV_BUFFER_SIZE
8192
6.
7./*************************************
8.*
main
9.*
功能
socket通信客户端
10.**************************************/
11.void
main(int
argc,
char*
argv[])
12.{
13.
//
变量定义
14.
SOCKADDR_IN
clientService;
地址
15.
SOCKET
ConnectSocket;
socket
16.
WSADATA
wsaData;
库
17.
LPVOID
recvbuf;
接收缓存
18.
int
bytesSent;
19.
bytesRecv
=
0;
20.
char
sendbuf[32]
get
information"
;
默认发送的数据
21.
22.
初始化socket库,
保存ws2_32.dll已经加载
23.
iResult
WSAStartup(MAKEWORD(2,2),
&
wsaData);
24.
if
(iResult
!
NO_ERROR)
25.
printf("
Error
at
WSAStartup()\n"
);
26.
27.
创建socket
28.
ConnectSocket
socket(AF_INET,
IPv4
29.
SOCK_STREAM,
顺序的、可靠的、基于连接的、双向的数据流通信
30.
IPPROTO_TCP//
使用TCP协议
31.
32.
(ConnectSocket
==
INVALID_SOCKET)
33.
{
34.
socket():
%ld\n"
WSAGetLastError());
35.
WSACleanup();
36.
return;
37.
}
38.
39.
设置服务端的通信协议、IP地址、端口
40.
clientService.sin_family
AF_INET;
41.
clientService.sin_addr.s_addr
inet_addr(
127.0.0.1"
42.
clientService.sin_port
htons(
10000
43.
44.
连接到服务端
45.
(
connect(
46.
ConnectSocket,
47.
(SOCKADDR*)
clientService,
48.
sizeof(clientService)
地址的大小
49.
)
SOCKET_ERROR)
50.
51.
printf(
Failed
to
connect(%d)\n"
WSAGetLastError()
52.
53.
54.
55.
准备发送数据
56.
如果输入参数是-d,那么发送的数据是“download
file”否则是"
57.
if(argc
==2
(!
lstrcmp(argv[1],
-d"
)))
58.
59.
lstrcpyn(sendbuf,
download
file"
32);
60.
61.
向服务端发送数据
62.
bytesSent
send(
63.
sendbuf,//
发送的数据
64.
lstrlen(sendbuf)+1,//
数据长度
65.
0
无标志
66.
67.
if(bytesSent
68.
69.
send
error
(%d)\n"
70.
closesocket(ConnectSocket);
71.
72.
73.
Bytes
Sent:
74.
75.
准备接收数据
76.
recvbuf
HeapAlloc(GetProcessHeap(),
0,
RECV_BUFFER_SIZE);
77.
循环接收
78.
while(
SOCKET_ERROR
79.
80.
//Sleep(50);
81.
recv(
82.
recvbuf,
接收数据缓存
83.
RECV_BUFFER_SIZE,//
缓存大小
84.
85.
86.
87.
Connection
Closed.\n"
88.
break;
89.
90.
TODO,处理接收的数据,这里只简单的将收到的数据大小显示
91.
Recv:
92.
93.
HeapFree(GetProcessHeap(),
recvbuf);
94.
95.
96.}
实现服务端
winsock2.h>
ws2tcpip.h>
4.#include
5./*
6.#define
DEFAULT_PORT
10000"
端口
7.#define
MAX_REQUEST
1024
接收数据的缓存大小
8.#define
BUF_SIZE
4096
发送数据的缓存大小
9.
10./*************************************
11.*
CommunicationThread
12.*
用于接收和发送数据的线程
13.*
为每一个连接的客户端创建一个接收发送数据的线程,
14.*
可以使用多个客户端同时连接到服务端
15.*
参数
lpParameter,SOKCET
16.**************************************/
17.DWORD
WINAPI
CommunicationThread(
lpParameter
20.{
DWORD
dwTid
GetCurrentThreadId();
获得参数sokcet
socket
(SOCKET)lpParameter;
为接收数据分配空间
LPSTR
szRequest
HeapAlloc(GetProcessHeap(),0,
MAX_REQUEST);
iResult;
用于保存send的返回值,实际发送的数据的大小
接收数据
recv(socket,
szRequest,
MAX_REQUEST,
0);
标志
0)//
接收数据失败,连接已经关闭
closing...\n"
szRequest);
closesocket(socket);
return
1;
else
SOCKET_ERROR)//
接收数据失败,socket错误
recv
failed:
%d\n"
>
0)
接收数据成功
显示接收到的数据
\tCommunicationThread(%d)\tBytes
received:
dwTid,
iResult);
\tCommunicationThread(%d)\trequest
string
is
(%s)\n"
dwTid,
szRequest);
如果接收到的数据是"
(lstrcmpi(szRequest,
读取文件download.txt将发送
HANDLE
hFile;
lpReadBuf;
发送缓存
dwBytesRead;
dwFileSize;
dwSendFile
hFile
CreateFile("
download.txt"
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
(hFile
INVALID_HANDLE_VALUE)
\tCommunicationThread\tCould
not
open
file
(error
%d)\n"
GetLastError());
send(socket,
error"
6,
分配发送数据缓存
lpReadBuf
BUF_SIZE);
获取文件大小
dwFileSize
GetFileSize(hFile,
循环发送
while
(1)
读文件到缓存
if(!
ReadFile(hFile,
lpReadBuf,
BUF_SIZE,
dwBytesRead,
NULL))
read
from
CloseHandle(hFile);
发送读取的文件数据
96.
97.
if(
98.
99.
\tCommunicationThread\tsend
100.
101.
102.
103.
104.
105.
显示发送数据的大小
106.
\tCommunicationThread(%d)\tsend
%d
bytes\n"
bytesSent);
107.
累加,已经发送的大小
108.
+=
109.
如果所有文件数据都已经发送
110.
if(dwSendFile
dwFileSize)
111.
112.
\tCommunicationThread\tFile
ok\n"
113.
退出循环
114.
115.
116.
释放内存、关闭连接,关闭文件
117.
lpReadBuf);
118.
119.
120.
121.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 socket 通信