套接字创建和关闭:
SOCKET socket(int af,int type,int protocal);
套接字类型:
SOCK_STREAM 流套接字,TCP提供有连接的可靠传输
SOCK_DGRAM 数据包套接字,UDP提供无连接的不可靠传输
SOCK_RAW 原始套接字
绑定套接字到指定的IP地址和端口号
int bind(
SOCKET s,//套接字句柄
const struct sockaddr * name,//关联的本地地址
int namelen//地址的长度
);
监听
int listen(
SOCKET s,//套接字
int backlog//最大连接数
)
连接
int accept(
SOCKET s,
struct sockaddr* addr,//取得对方的地址信息
int* addrlen//指向地址长度
);
int connect(
SOCKET s,
const struct sockaddr FAR* name,//连接的地址信息
int namelen //结构长度
);
收发数据
int send(
SOCKET s,
const char FAR* buf,//要发送数据的缓冲区地址
int len,//缓冲区长度
int flags//指定调用方式,通常为0
);
int recv(
SOCKET s,
char FAR* buf,
int len,
int
);
TCPSERVER端代码:
1 // TCP.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include <winsock2.h>
6 #include <stdio.h>
7
8 #pragma comment(lib,"WS2_32")
9 class CInitSock
10 {
11 public:
12 CInitSock(BYTE minorVer=2,BYTE majorVer=2)
13 {
14 WSADATA wsaData;
15 WORD sockVersion = MAKEWORD(minorVer,majorVer);
16 if(::WSAStartup(sockVersion,&wsaData)!=0)
17 {
18 exit(0);
19 }
20 }
21 ~CInitSock()
22 {
23 ::WSACleanup();
24 }
25 };
26 CInitSock initSock;
27 int _tmain(int argc, _TCHAR* argv[])
28 {
29 SOCKET sListen = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
30 if(sListen == INVALID_SOCKET)
31 {
32 printf("Failed socket()\n");
33 return 0;
34 }
35 //填充sockaddr_in结构
36 sockaddr_in sin;
37 sin.sin_family = AF_INET;
38 sin.sin_port = htons(4567);
39 sin.sin_addr.S_un.S_addr = INADDR_ANY;
40 //绑定这个套接字的一个本地地址
41 if(::bind(sListen,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
42 {
43 printf("Failed bind()\n");
44 return 0;
45 }
46 //进入监听模式
47 if(::listen(sListen,2) == SOCKET_ERROR)
48 {
49 printf("Failed listen()\n");
50 return 0;
51 }
52 //循环接受客户的连接请求
53 sockaddr_in remoteAddr;
54 int nAddrLen = sizeof(remoteAddr);
55 SOCKET sClient;
56 char szText[] = "TCP Server Demo!\r\n";
57 while(TRUE)
58 {
59 //接受新连接
60 sClient=::accept(sListen,(SOCKADDR*)&remoteAddr,&nAddrLen);
61 if(sClient == INVALID_SOCKET)
62 {
63 printf("Failed accept()");
64 continue;
65 }
66 printf("接受到一个连接:%s\r\n",inet_ntoa(remoteAddr.sin_addr));
67 //向客户端发送数据
68 ::send(sClient,szText,strlen(szText),0);
69 //关闭同客户端的连接
70 ::closesocket(sClient);
71 }
72 ::closesocket(sListen);
73 return 0;
74 }
TCPClient 端代码:
1 // TCPClient.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include <winsock2.h>
6 #include <stdio.h>
7 #pragma comment(lib,"WS2_32")
8 class CInitSock
9 {
10 public:
11 CInitSock(BYTE minorVer=2,BYTE majorVer=2)
12 {
13 WSADATA wsaData;
14 WORD sockVersion = MAKEWORD(minorVer,majorVer);
15 if(::WSAStartup(sockVersion,&wsaData)!=0)
16 {
17 exit(0);
18 }
19 }
20 ~CInitSock()
21 {
22 ::WSACleanup();
23 }
24 };
25 CInitSock initSock;
26
27 int _tmain(int argc, _TCHAR* argv[])
28 {
29 SOCKET s= ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
30 if(s==INVALID_SOCKET)
31 {
32 printf("Failed socket()\n");
33 return 0;
34 }
35 sockaddr_in servAddr;
36 servAddr.sin_family=AF_INET;
37 servAddr.sin_port=htons(4567);
38 servAddr.sin_addr.S_un.S_addr=inet_addr("49.140.16.244");
39 if(::connect(s,(sockaddr*)&servAddr,sizeof(servAddr))==-1)
40 {
41 printf("Failed connect()\n");
42 return 0;
43 }
44 //接受数据
45 char buff[256];
46 int nRecv=::recv(s,buff,256,0);
47 if(nRecv>0)
48 {
49 buff[nRecv] = '\0';
50 printf("接受到数据:%s",buff);
51 }
52 ::closesocket(s);
53 return 0;
54 }
结果:
扫描二维码关注公众号,回复:
6566609 查看本文章
转载于:https://my.oschina.net/u/204616/blog/545488