socket编程学习step1

socket学习参考链接,赞一个:http://blog.csdn.net/hguisu/article/details/7445768

 

sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据包套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程采用的都是流式套接字。

 

服务端socket编程步骤:

1、加载套接字库,创建套接字(WSAStartup()/socket());

2、绑定套接字到一个IP地址和一个端口上(bind());

3、将套接字设置为监听模式等待请求(listen());

4、请求到来后,接受请求,返回一个新的对应于此次连接的套接字(accept());

5、用返回的套接字和客户端通信(send()/recv());

6、返回,等待另一连接请求;

7、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());

 

客户端socket编程步骤:

1、加载套接字库,创建套接字(WSAStartup()/socket());

2、向服务端发送连接请求(connect());

3、和服务端进行通信(send()/recv());

4、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());

 

第一式: 加载/释放Winsock库:

1.加载方法:

WSADATA wsa;
/*初始化socket资源*/
if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
{
    return;   //代表失败
}

2.释放方法:

WSACleanup();

第二式: 构造SOCKET:

1.服务端:构造监听SOCKET,流式SOCKET.
   SOCKET Listen_Sock = socket(AF_INET, SOCK_STREAM, 0)

2.客户端:构造通讯SOCKET,流式SOCKET.
SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0)

第三式:配置监听地址和端口:

1.服务端: SOCKADDR_IN serverAddr
ZeroMemory((char *)&serverAddr,sizeof(serverAddr));
   serverAddr.sin_family = AF_INET;
   serverAddr.sin_port = htons(1234);           /*本地监听端口:1234*/
   serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /*有IP*/

第四式:   绑定SOCKET:

1.服务端:绑定监听SOCKET.
  bind(Listen_Sock,(struct sockaddr *)&serverAddr,sizeof(serverAddr))

第五式: 服务端/客户端连接:

1.服务端:等待客户端接入.
   SOCKET Command_Sock = accept(Listen_Sock, ...)

2.客户端:请求与服务端连接.
int ret = connect(Client_Sock, ...)

第六式: 收/发数据:

1.服务端:等待客户端接入.char buf[1024].
    接收数据:recv(Command_Sock,buf, ...)

    发送数据:send(Command_Sock,buf, ...)

2.客户端:请求与服务端连接.char buf[1024].
    发送数据:send(Client_Sock,buf, ...)

    接收数据:recv(Client_Sock,buf, ...)

第七式: 关闭SOCKET:

1.服务端:关闭SOCKET.
   closesocket(Listen_Sock)
closesocket(Command_Sock)

2.客户端:关闭SOCKET.
closesocket(Client_Sock)

 

server端:

 1 #include "stdafx.h"
 2 #include <stdio.h>
 3 #include <winsock2.h>
 4 
 5 #pragma comment(lib,"ws2_32.lib")
 6 
 7 int main(int argc, char* argv[])
 8 {
 9     //初始化WSA(Windows Sockets API)
10     WORD sockVersion = MAKEWORD(2, 2);    //高8位设置2,低8位设置2
11     WSADATA wsaData;
12     if (WSAStartup(sockVersion, &wsaData) != 0)      //sockVersion是一个int型变量
13     {
14         return 0;
15     }
16 
17     //创建套接字
18     SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //socket(int family, int type, int protocol)
19     if (slisten == INVALID_SOCKET)
20     {
21         printf("socket error !");
22         return 0;
23     }
24 
25     //绑定IP和端口
26     sockaddr_in sin;
27     sin.sin_family = AF_INET;               //协议域
28     sin.sin_port = htons(8888);             //端口
29     sin.sin_addr.S_un.S_addr = INADDR_ANY;  //协议地址
30     if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) //bind(SOCKET sock, const struct sockaddr *addr)
31     {
32         printf("bind error !");
33     }
34 
35     //开始监听
36     if (listen(slisten, 5) == SOCKET_ERROR)
37     {
38         printf("listen error !");
39         return 0;
40     }
41 
42     //循环接收数据
43     SOCKET sClient;
44     sockaddr_in remoteAddr;
45     int nAddrlen = sizeof(remoteAddr);
46     char revData[255];
47     while (true)
48     {
49         printf("等待连接...\n");
50         sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
51         if (sClient == INVALID_SOCKET)
52         {
53             printf("accept error !");
54             continue;
55         }
56         printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
57 
58         //接收数据
59         int ret = recv(sClient, revData, 255, 0);
60         if (ret > 0)
61         {
62             revData[ret] = 0x00;
63             printf(revData);
64         }
65 
66         //发送数据
67         char * sendData = "你好,TCP客户端!\n";
68         send(sClient, sendData, strlen(sendData), 0);
69         closesocket(sClient);
70     }
71 
72     closesocket(slisten);
73     WSACleanup();
74     return 0;
75 }
View Code

client端:

 1 #include "stdafx.h"
 2 #include <WINSOCK2.H>
 3 #include <STDIO.H>
 4 
 5 #pragma  comment(lib,"ws2_32.lib")
 6 
 7 
 8 int main(int argc, char* argv[])
 9 {
10     WORD sockVersion = MAKEWORD(2,2);
11     WSADATA data; 
12     if(WSAStartup(sockVersion, &data) != 0)
13     {
14         return 0;
15     }
16 
17     SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
18     if(sclient == INVALID_SOCKET)
19     {
20         printf("invalid socket !");
21         return 0;
22     }
23 
24     sockaddr_in serAddr;
25     serAddr.sin_family = AF_INET;
26     serAddr.sin_port = htons(8888);
27     serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 
28     if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
29     {
30         printf("connect error !");
31         closesocket(sclient);
32         return 0;
33     }
34     char * sendData = "你好,TCP服务端,我是客户端!\n";
35     send(sclient, sendData, strlen(sendData), 0);
36 
37     char recData[255];
38     int ret = recv(sclient, recData, 255, 0);
39     if(ret > 0)
40     {
41         recData[ret] = 0x00;
42         printf(recData);
43     }
44     closesocket(sclient);
45     WSACleanup();
46     return 0;
47 }
View Code

 

转载于:https://www.cnblogs.com/kane0526/p/5885385.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值