socket 服务器端和客户端通信,面向TCP的
服务器端步骤:
1、创建用于监听的套接字(socket)
2、将套接字绑定到本地地址和端口上(bind)
3、将套接字设为监听模式(listen)
4、等待客户请求(accept),此处要不断的调用accept
5、通信(send/receive),完成后返回4
6、关闭套接字(closesocket)
客户端步骤:
1、创建套接字
2、向服务器发送连接请求(connect)
3、通信(send/recv)
4、关闭套接字
程序代码:http://www.cnblogs.com/xiao-cheng/archive/2012/02/04/2337822.html
服务器端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib,"Ws2_32.lib.")
void
main()
{
/* 加载套接字库 */
WORD
wVersionRequested;
// 所使用套接字的版本号
WSADATA wsaData;
// 存储套接字版本的有关信息
int
err;
wVersionRequested = MAKEWORD(1,1);
// 请求版本号,高位和低位字节均为1
err = WSAStartup(wVersionRequested,&wsaData);
// 加载套接字
if
(err != 0)
{
return
;
}
if
(LOBYTE(wsaData.wVersion)!=1 ||
HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
//如果高位或低位字节不为1终止对套接字的使用
return
;
}
/* 创建用于监听的套接字 */
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
// 创建套接字,流式套接字,第三个参数设为0则自动选择合适的协议
/* 绑定套接字 */
SOCKADDR_IN addrSrv;
// 服务器地址信息,使用SOCKADDR_IN 代替SOCKETADD, 结构体的大小相等,可强制转换
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(600);
// 使用htons函数转换为网络字节序
bind(sockSrv,(SOCKADDR *)&addrSrv,
sizeof
(SOCKADDR));
// 将监听套接字绑定到本地地址和端口上
listen(sockSrv,5);
// 监听
/* 等待客户到来并接收发送数据 */
SOCKADDR_IN addrClient;
// 接收客户地址信息缓冲区
int
len=
sizeof
(SOCKADDR);
while
(1){
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
// 等待接收客户连接请求,并返回连接套接字,利用这个套接字实现通信
char
sendBuf[100];
sprintf
(sendBuf,
"Welcome %s to www.cnblogs.com/xiao-cheng"
,
inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,
strlen
(sendBuf)+1,0);
// 发送数据,多加一个长度是字符串结束符
char
recvBuf[100];
recv(sockConn,recvBuf,100,0);
// 接收数据
printf
(
"%s\n"
,recvBuf);
closesocket(sockConn);
}
}
|
1
|
客户端:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib,"Ws2_32.lib.")
void
main()
{
WORD
wVersionRequested;
WSADATA wsaData;
int
err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if
(err!=0)
{
return
;
}
if
(LOBYTE(wsaData.wVersion)!=1
|| HIBYTE(wsaData.wVersion)!=1){
WSACleanup();
return
;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
// 服务器地址信息
addrSrv.sin_addr.S_un.S_addr=inet_addr(
"127.0.0.1"
);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(600);
connect(sockClient,(SOCKADDR*)&addrSrv,
sizeof
(SOCKADDR));
// 向服务器发送连接请求
char
recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf
(
"%s\n"
,recvBuf);
send(sockClient,
"Request"
,
strlen
(
"Request"
)+1,0);
closesocket(sockClient);
WSACleanup();
}
|