一常用数据结构
1 SOCKET
typedef u_int SOCKET
其实就是一个无符号的整数,是一个socket描述符,我的理解就是 ,指向系统内核的”指针”,但这个”指针”要靠系统维护,我们只能获取,还要负责释放.
2 SOCKADDR_IN
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
IN_ADDR sin_addr;
char sin_zero[8];
};
用来指定本地或远程的地址,以此来进行socket连接
sin_family:指定为AF_INET
sin_port: 指定所连接的端口号,用htons将short的端口号进行转换,如htons(6000)
sin_addr:指定所连接的ip,用inet_addr装换,如inet_addr(“127.0.0.1”)
sin_zero:为了和SOCKADDR的大小相同,而进行的填充,应该将其初始化为0
二 常用函数
1 WSAStartup
原型:
int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData)
作用:
用来初始化ws2_32.lib
返回值:
成功返回0
2 WSACleanup
终止ws2_32.lib
3 socket
原型:
SOCKET socket (int af, int type, int protocol );
参数说明
af:指定地址家族,AF_INET
type: SOCK_STREAM或SOCK_DGRAM,前者用于TCP,后者用于UDP
protocol:设置为0即可
作用:
创建一个SOCKET
返回值
创建失败返回INVALID_SOCKET
4 bind
原型:
int bind( SOCKET s, const struct sockaddr FAR *name,int namelen );
参数说明
s:server端已经创建好的SOCKET
name:server的SOCKADDR_IN结构,需要做强制类型转换,注意,他和SOCKADDR的大小一样
namelen:顾名思义,name的size大小,注意他和SOCKADDR的大小一样
作用
将SOCKET绑定到机器上
返回值
成功返回0,错误返回SOCKET_ERROR
5 listen
原型
int listen( SOCKET s, int backlog );
参数说明
s: 服务端未连接的SOCKET
backlog:最大可连接数
作用
设置tcp服务端
返回值
成功返回0,失败返回SOCKET_ERROR
6 accept
原型
SOCKET accept( SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen);
参数说明
s:tcp服务端的SOCKET
addr:远程客户端的地址信息
addlen:addr的size
作用
从已经获得许可的连接中关联一个新的SOCKET
返回值
成功返回新的SOCKET的值,错误返回INVALID_SOCKET
7 send
原型
int send(SOCKET s, const char FAR *buf, int len, int flags );
参数说明
s:对方的SOCKET
buf:要发送的缓冲区的地址
flags:通常置为0
作用
向对方发送数据
返回值
成功返回已发送的数据的字节数,错误返回SOCKET_ERROR
8 recv
原型
int recv( SOCKET s, char FAR *buf, int len, int flags );
参数说明
s:对方的SOCKET
buf:要发送的缓冲区的地址
flags:通常置为0
作用
接受对方的数据
返回值
成功返回已接受的数据的字节数,错误返回SOCKET_ERROR
9 closesocket
原型
int closesocket( SOCKET s );
参数说明
s:要关闭的SOCKET
作用
关闭指定的SOCKET
返回值
成功返回0,错误返回SOCKET_ERROR
10 connect
原型
Int connect(SOCKET s,const struct sockaddr FAR *name,int namelen) );
参数说明
S:本地SOCKET
name:远程服务端地址信息
namelen:name的size
作用
远程socket连接
返回值
成功返回0,错误返回SOCKET_ERROR
11 sendto
原型
int sendto( SOCKET s, const char FAR *buf, int len, int flags, const struct sockaddr FAR *to, int tolen); );
参数说明
S:对方的SOCKET,可能是连接状态
buf:要发送的信息地址
len:信息的大小
flags:通常置为0
to:远程地址信息
tolen:to的size
作用
用于UDP,数据的发送
返回值
成功返回已发送的数据的字节数,错误返回SOCKET_ERROR
12 recvfrom
原型
int recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR *from, int FAR *fromlen );
参数说明
S:对方的SOCKET,可能是连接状态
buf:用于接收的缓冲区地址
len:信息的大小
flags:通常置为0
from:接收远程地址信息
fromlen:to的size
作用
用于UDP,数据的接收
返回值
成功返回已接收的数据的字节数,错误返回SOCKET_ERROR
15 WSAGetLastError
原型: int WSAGetLastError (void);
作用:返回最后一次的错误代码
错误代码在WINSOCK2.H中定义
14 一些转换函数
ntohs:”network to host short”
ntohl:”network to host long”
htons:”host to network short”
htonl:”host to network long”
inet_addr:将字符串的IP转换为网络IP
三正式编程
以下程序在vc6.0下编译
1 tcp编程
TCP Server:
1. /************************************************************************/
2. /*
3. 准备步骤
4. #include <WINSOCK2.H>
5. #pragma comment(lib, "ws2_32.lib ")
6.
7. 服务器端编程的步骤:
8. 0:加载套接字库(WSAStartup())
9.
10. 1:创建套接字(socket());
11.
12. 2:绑定套接字到一个IP地址和一个端口上(bind());
13.
14. 3:将套接字设置为监听模式等待连接请求(listen());
15.
16. 4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
17.
18. 5:用返回的套接字和客户端进行通信(send()/recv());
19.
20. 6:返回,等待另一连接请求;
21.
22. 7:关闭套接字(closesocket())
23.
24. 8:关闭加载的套接字库(WSACleanup())。
25.
26. */
27. /************************************************************************/
28. #include <WINSOCK2.H>
29. #include <windows.h>
30. #include <iostream>
31. #include <string>
32. using namespace
33. #pragma comment(lib, "ws2_32.lib ")
34.
35.
36. //0
37. bool
38. //1
39. bool CreateSocket(SOCKET& sock,int
40. //2
41. bool BindSocket(SOCKET& sock,short port ,const char* strIp);
42. //3
43. bool SetListen(SOCKET& sock,int
44. //4,5,6
45. bool
46. //7
47. bool
48. //8
49. void
50.
51. void ExitWithErrorMessage(const
52.
53. DWORD WINAPI ClientThread(LPVOID
54.
55. void
56. {
57. "start server.\n";
58.
59. if(!LoadWSA() )
60. "LoadWSA failed.");
61. "LoadWAS success.\n";
62.
63. SOCKET serSock;
64.
65. if(!CreateSocket(serSock) )
66. "create server socket failed.");
67. "CreateSocket success.\n";
68.
69. if(!BindSocket(serSock,6000,"127.0.0.1") )
70. "BindSocket failed.");
71. "BindSocket success.\n";
72.
73. if(!SetListen(serSock,10) )
74. "SetListen failed.");
75. "SetListen success.\n";
76.
77. if(!Communicate(serSock) )
78. "Communicate failed.");
79. "Communicate success.\n";
80.
81. if(! CloseSocket(serSock) )
82. "CloseSocket failed.");
83. "CloseSocket success.\n";
84.
85. CloseWSA();
86. "CloseWSA success.\n";
87. }
88.
89.
90. bool
91. {
92. WSAData wsaData;
93.
94. if( 0 == WSAStartup(MAKEWORD(2,2),&wsaData) )
95. {
96. return true;
97. }
98.
99. return false;
100. }
101.
102. void
103. {
104. WSACleanup();
105. }
106.
107. bool CreateSocket(SOCKET& sock,int type/* =SOCK_STREAM */)
108. {
109. sock=socket(AF_INET,type,0);
110.
111. if(INVALID_SOCKET == sock)
112. {
113. return false;
114. }
115.
116. return true;
117. }
118.
119. bool BindSocket(SOCKET& sock,short port ,const char* strIp)
120. {
121. SOCKADDR_IN address;
122.
123. address.sin_family=AF_INET;
124. address.sin_addr.s_addr =inet_addr(strIp);
125. address.sin_port=htons(port);
126. sizeof(address.sin_zero));
127.
128. if(SOCKET_ERROR == bind(sock,(const struct sockaddr*)&address,sizeof(struct
129. {
130. return false;
131. }
132.
133. return true;
134. }
135.
136. bool SetListen(SOCKET& sock,int
137. {
138. if(SOCKET_ERROR == listen(sock,number) )
139. {
140. return false;
141. }
142.
143. return true;
144. }
145.
146. bool
147. {
148. SOCKADDR_IN addrClient;
149. SOCKET newSock;
150. HANDLE
151. int n=sizeof(struct
152. bool flag=true;
153.
154. while(true)
155. {
156. struct
157.
158. if(newSock == INVALID_SOCKET)
159. {
160. "accept failed.\n";
161. false;
162. break;
163. }
164.
165. "client from "<<inet_ntoa(addrClient.sin_addr)<<":"<<ntohs(addrClient.sin_port)<<endl;
166.
167. LPVOID)newSock,0,NULL);
168.
169. if(hThread==NULL)
170. {
171. "CreateThread failed.\n";
172. false;
173. break;
174. }
175.
176. CloseHandle(hThread);
177. }
178.
179. closesocket(newSock);
180.
181. return
182. }
183.
184.
185. bool
186. {
187. if( closesocket(sock) == SOCKET_ERROR)
188. return false;
189. return true;
190. }
191.
192. void ExitWithErrorMessage(const
193. {
194. cout<<errMsg<<endl;
195. "pause");
196. exit(1);
197. }
198.
199. DWORD WINAPI ClientThread(LPVOID
200. {
201. SOCKET sock=(SOCKET)sockCliet;
202. char
203. int
204.
205. while(true)
206. {
207. memset(buffer,0,100);
208. errCode=recv(sock,buffer,100,0);
209.
210. if(errCode==0 || errCode==SOCKET_ERROR)
211. {
212. "client exit.\n";
213. break;
214. }
215.
216. "message from client: "<<buffer<<endl;
217.
218. "welcome.",strlen("welcome."),0);
219. }
220.
221. return
222. }
TCP Client
1. /************************************************************************/
2. /*
3. 准备步骤
4. #include <WINSOCK2.H>
5. #pragma comment(lib, "ws2_32.lib ")
6.
7. 0:加载套接字库(WSAStartup())
8.
9. 1:创建套接字(socket());
10.
11. 2:向服务器发出连接请求(connect());
12.
13. 3:和服务器端进行通信(send()/recv());
14.
15. 4:关闭套接字(closesocket())
16.
17. 5: 关闭加载的套接字库(WSACleanup())。
18.
19. */
20. /************************************************************************/
21.
22. #include <WINSOCK2.H>
23. #include <windows.h>
24. #include <iostream>
25. #include <string>
26. using namespace
27. #pragma comment(lib, "ws2_32.lib ")
28.
29.
30. //0
31. bool
32. //1
33. bool CreateSocket(SOCKET& sock,int
34. //2
35. bool ConnectToServer(SOCKET& sock,short port ,const char* strIp);
36. //3
37. bool
38. //4
39. bool
40. //5
41. void
42.
43. void ExitWithErrorMessage(const
44.
45.
46. void
47. {
48. "Start Client.\n";
49. if(!LoadWSA() )
50. "LoadWSA failed.");
51. "LoadWSA Success.\n";
52.
53. SOCKET clietSock;
54.
55. if(!CreateSocket(clietSock) )
56. "create server socket failed.");
57. "CreateSocket Success.\n";
58.
59. if(!ConnectToServer(clietSock,6000,"127.0.0.1") )
60. "ConnectToServer failed.");
61. "ConnectToServer Success.\n";
62.
63. if(!Communicate(clietSock) )
64. "Communicate failed.");
65. "Communicate Success.\n";
66.
67. if(! CloseSocket(clietSock) )
68. "CloseSocket failed.");
69. "CloseSocket Success.\n";
70.
71. CloseWSA();
72. "CloseWSA Success.\n";
73.
74.
75. }
76.
77. bool
78. {
79. WSAData wsaData;
80.
81. if( 0 == WSAStartup(MAKEWORD(2,2),&wsaData) )
82. {
83. return true;
84. }
85.
86. return false;
87. }
88.
89. void
90. {
91. WSACleanup();
92. }
93.
94. bool CreateSocket(SOCKET& sock,int type/* =SOCK_STREAM */)
95. {
96. sock=socket(AF_INET,type,0);
97.
98. if(INVALID_SOCKET == sock)
99. {
100. return false;
101. }
102.
103. return true;
104. }
105.
106. bool ConnectToServer(SOCKET& sock,short port ,const char* strIp)
107. {
108. SOCKADDR_IN address;
109.
110. address.sin_family=AF_INET;
111. address.sin_addr.s_addr=inet_addr(strIp);
112. address.sin_port=htons(port);
113. sizeof(address.sin_zero));
114.
115. if(SOCKET_ERROR == connect(sock,(const struct sockaddr*)&address,sizeof(struct
116. {
117. return false;
118. }
119.
120. return true;
121. }
122.
123. bool
124. {
125. bool flag=true;
126. int
127. char
128.
129. while(true)
130. {
131. memset(buffer,0,100);
132. cin.getline(buffer,100);
133. errCode=send(sock,buffer,strlen(buffer),0);
134.
135. if(errCode==SOCKET_ERROR)
136. {
137. "send message error.\n";
138. false;
139. break;
140. }
141.
142. memset(buffer,0,100);
143. recv(sock,buffer,100,0);
144. cout<<buffer<<endl;
145. }
146.
147. return
148. }
149.
150.
151.
152. void ExitWithErrorMessage(const
153. {
154. cout<<errMsg<<endl;
155. "pause");
156. exit(1);
157. }
158.
159. bool
160. {
161. if( closesocket(sock)==SOCKET_ERROR )
162. return false;
163.
164. return true;
165. }
2 upd编程
UDP Server
1. /************************************************************************/
2. /*
3. 准备步骤
4. #include <WINSOCK2.H>
5. #pragma comment(lib, "ws2_32.lib ")
6.
7. 0: 加载套接字库(WSAStartup());
8.
9. 1:创建套接字(socket());
10.
11. 2:绑定套接字到一个IP地址和一个端口上(bind());
12.
13. 3:等待和接收数据(sendto()/recvfrom());
14.
15. 4:关闭套接字(closesocket());
16.
17. 5: 关闭加载的套接字库(WSACleanup()).
18. */
19. /************************************************************************/
20.
21. #include <WINSOCK2.H>
22. #include <windows.h>
23. #include <iostream>
24. #include <string>
25. using namespace
26. #pragma comment(lib, "ws2_32.lib ")
27.
28.
29. //0
30. bool
31. //1
32. bool CreateSocket(SOCKET& sock,int
33. //2
34. bool BindSocket(SOCKET& sock,short port ,const char* strIp);
35. //4
36. bool
37. //5
38. bool
39. //6
40. void
41.
42. void ExitWithErrorMessage(const
43.
44.
45. void
46. {
47. if(! LoadWSA() )
48. "LoadWSA falid.");
49. "LoadWSA success.\n";
50.
51. SOCKET serSocket;
52. if(! CreateSocket(serSocket) )
53. "CreateSocket falid.");
54. "CreateSocket success.\n";
55.
56. if(! BindSocket(serSocket,6000,"127.0.0.1") )
57. "BindSocket falid.");
58. "BindSocket success.\n";
59.
60. while(! Communicate(serSocket) );
61. "Communicate success.\n";
62.
63. if(! CloseSocket(serSocket) )
64. "CloseSocket falid.");
65. "CloseSocket success.\n";
66.
67. CloseWSA();
68. }
69.
70.
71. bool
72. {
73. WSAData wsaData;
74.
75. if( 0 == WSAStartup(MAKEWORD(2,2),&wsaData) )
76. {
77. return true;
78. }
79.
80. return false;
81. }
82.
83. void
84. {
85. WSACleanup();
86. }
87.
88. bool CreateSocket(SOCKET& sock,int
89. {
90. sock=socket(AF_INET,type,0);
91.
92. if(INVALID_SOCKET == sock)
93. {
94. return false;
95. }
96.
97. return true;
98. }
99.
100. bool BindSocket(SOCKET& sock,short port ,const char* strIp)
101. {
102. SOCKADDR_IN address;
103.
104. address.sin_family=AF_INET;
105. address.sin_addr.s_addr =inet_addr(strIp);
106. address.sin_port=htons(port);
107. sizeof(address.sin_zero));
108.
109. if(SOCKET_ERROR == bind(sock,(const struct sockaddr*)&address,sizeof(struct
110. {
111. return false;
112. }
113.
114. return true;
115. }
116.
117. bool
118. {
119. bool flag =true;
120. SOCKADDR_IN address;
121. int n=sizeof(struct
122. char
123.
124. if(recvfrom(srverSock,buffer, 100,0,(struct
125. false;
126.
127. if(flag)
128. cout<<buffer;
129.
130. return
131. }
132.
133. void ExitWithErrorMessage(const
134. {
135. cout<<errMsg<<endl;
136. "pause");
137. exit(1);
138. }
139.
140. bool
141. {
142. if( closesocket(sock)==SOCKET_ERROR )
143. return false;
144.
145. return true;
146. }
TCP Client
1. /************************************************************************/
2. /*
3. 准备步骤
4. #include <WINSOCK2.H>
5. #pragma comment(lib, "ws2_32.lib ")
6.
7. 0: 加载套接字库(WSAStartup());
8.
9. 1:创建套接字(socket());
10.
11. 2:等待和接收数据(sendto()/recvfrom());
12.
13. 3:关闭套接字(closesocket());
14.
15. 4: ,关闭加载的套接字库(WSACleanup()).
16. */
17. /************************************************************************/
18.
19. #include <WINSOCK2.H>
20. #include <windows.h>
21. #include <iostream>
22. #include <string>
23. using namespace
24. #pragma comment(lib, "ws2_32.lib ")
25.
26.
27. //0
28. bool
29. //1
30. bool CreateSocket(SOCKET& sock,int
31. //2
32. bool Communicate(SOCKET& clientSock,short port ,const char* strIp);
33. //3
34. bool
35. //4
36. void
37.
38. void ExitWithErrorMessage(const
39.
40.
41. void
42. {
43. if(! LoadWSA() )
44. "LoadWSA falid.");
45. "LoadWSA success.\n";
46.
47. SOCKET clientSocket;
48. if(! CreateSocket( clientSocket) )
49. "CreateSocket falid.");
50. "CreateSocket success.\n";
51.
52. if(! Communicate( clientSocket,6000,"127.0.0.1") )
53. "Communicate falid.");
54. "Communicate success.\n";
55.
56. if(! CloseSocket( clientSocket) )
57. "CloseSocket falid.");
58. "CloseSocket success.\n";
59.
60. CloseWSA();
61. }
62.
63.
64. bool
65. {
66. WSAData wsaData;
67.
68. if( 0 == WSAStartup(MAKEWORD(2,2),&wsaData) )
69. {
70. return true;
71. }
72.
73. return false;
74. }
75.
76. void
77. {
78. WSACleanup();
79. }
80.
81. bool CreateSocket(SOCKET& sock,int
82. {
83. sock=socket(AF_INET,type,0);
84.
85. if(INVALID_SOCKET == sock)
86. {
87. return false;
88. }
89.
90. return true;
91. }
92.
93.
94. bool Communicate(SOCKET& clientSock,short port ,const char* strIp)
95. {
96. bool flag =true;
97. SOCKADDR_IN address;
98. int n=sizeof(struct
99.
100. address.sin_family=AF_INET;
101. address.sin_addr.s_addr=inet_addr(strIp);
102. address.sin_port=htons(port);
103. sizeof(address.sin_zero));
104.
105. if( sendto(clientSock,"hello , I am from client message.", sizeof("hello , I am from server message."),
106. const struct sockaddr*)&address,sizeof(struct
107. false;
108.
109. return
110. }
111.
112. void ExitWithErrorMessage(const
113. {
114. cout<<errMsg<<endl;
115. "pause");
116. exit(1);
117. }
118.
119. bool
120. {
121. if( closesocket(sock)==SOCKET_ERROR )
122. return false;
123.
124. return true;
125. }