管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。" Z" L( V. c" D5 T" l* \9 N9 ^
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
; D% A2 G; }% }$ {+ X$ H/ ATalk is cheak , show me the code.
6 y) Z! g! z. d7 g/ B服务端代码:
7 V; H) h# r& a& d- F. V( n9 j& T- #include<stdlib.h>
, N3 h! y6 l2 V7 T - #include<WinSock2.h>
* G- }* K/ a4 d0 H( n* p: \ - #pragma comment(lib,"ws2_32.lib")& e0 b+ T8 d6 X4 p# z% W
- int main(){
9 f: m8 l6 {) s+ H) M - WSADATA wsd;1 y) C% m v! M) t9 W+ M8 V
- SOCKET sockServer;$ `$ D' T k2 q+ t, Z# r
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
! }$ C0 u6 W: a) ~+ c3 | - SOCKET sockClient;
, j6 ]: \6 J7 D/ v+ o - SOCKADDR_IN clientaddr;
$ m0 {) v3 G( v. n6 S( A - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口7 v0 e: o6 r" b. [4 x
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
" O6 b5 y/ o# C
6 V1 a- Z$ S* W, F5 V8 P: o0 @- 6 F1 G, C5 F0 Q* ]! v/ I& `1 r
- if (sockServer != -1 && sockServer != INVALID_SOCKET){; m, k# K# S6 U! k% l" X
- printf("Socket has been created :%d", sockServer);
5 w O3 s5 P/ P5 S% h - }
* z v5 H" J$ k, | - else{
. Y' w$ |% C4 V5 z& R: E6 m - printf("Socket create failed.");( i$ p) c0 k0 } o' ]+ p `
- exit(0);/ q/ } k) g3 `/ E$ S" c, I
- }" o6 f" a w6 l' l, w! m/ Z6 [" r( V
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);5 ]/ N) T$ j9 w- K$ q
- serveraddr.sin_family = AF_INET;
3 ]( X c: u+ a5 y1 u* j. |6 p - serveraddr.sin_port = htons(6000);//绑定端口6000: ?1 _7 m) T8 \7 \% v4 N2 G
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
8 w! _$ t+ J" U$ X - char recvBuf[100];% D0 Q* P* B ?! q$ W e! H( |
- int len = sizeof(SOCKADDR);
& H5 A" w. c; ~ - listen(sockServer, 5);//5为等待连接数
o$ Y! ?, m& n1 D, g6 B2 {! Y( _ - while (1){
8 P; N2 b% u8 u - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);8 v, {) A7 [" W& O- i; j" B6 g
- //接收客户端数据
/ V( k+ e/ [$ O - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
8 I0 q" H. R {( W - printf("to me:%s\n",recvBuf);
6 D' p0 ~0 Y, J0 S& }% Q - memset(recvBuf, 0, 100);
+ J" K9 Q% s# a6 G* U8 s! J - }
7 P5 y- x; G8 o - closesocket(sockClient);' e/ S! T O6 A0 o- J" x
- system("pause");
- t k/ S# A' v- P h1 \ - return 0;
% }! c' e7 X8 P' v4 g - }
复制代码 客户端代码:
2 |! @! R8 ], Z! L2 i- #include<winsock2.h>7 J1 ^ l* k# w
- #include<stdio.h>- V- m8 r, |$ H
- #pragma comment(lib, "ws2_32.lib")7 V& x% A L9 | R. g# h
- void main()0 I! ~1 f( K% [
- {
# ?' j' b: `. y7 U - WSADATA wsaData;. F, n2 I+ W9 u4 [2 Z5 W9 }! T
- SOCKET sockClient;//客户端Socket
: }4 o* c. W; G G! O/ | - SOCKADDR_IN addrServer;//服务端地址
7 \ v- b, H7 H! c - WSAStartup(MAKEWORD(2, 2), &wsaData);
& j1 u5 P: F. B" J# f! c" H - char message[20] = "HelloSocket!";4 ?/ Y4 O% x8 d7 n1 ^
- //定义要连接的服务端地址
- G9 |1 U5 O/ c2 R - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
# \% Z6 \0 Y3 w9 g# O2 ?( s - addrServer.sin_family = AF_INET;7 e7 Z% `8 V: _& L. O# }; H% e
- addrServer.sin_port = htons(6000);//连接端口60008 K+ c4 g4 O! n: }( g) G9 M: z
- //新建客户端socket8 Z0 b+ n% V/ X! |6 Z
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
: v' m6 [$ Y+ `6 O3 K$ c. r - int s = 0;: a# w) S/ G" @
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
& B5 K! s+ `: i - + G8 P/ A% u/ {
- while (1){
r+ K. _: l& ~1 o: V, P - //发送数据3 h4 {9 d$ [& ]$ D( Z: h5 w
- int a = send(sockClient, message, strlen(message) + 1, 0);8 u' N- Q- O$ Y1 l, ^
- printf("to server:");
. ?. z, ?2 l9 e G - scanf("%s", message);
/ u% z% T1 H3 [8 E
, e$ t( {" P y* ]2 w' }! P- }- ]# r8 w4 d7 Y+ p
- //关闭socket
$ K# _) Z. N8 E/ h% c - closesocket(sockClient);3 n1 a# E# ?) \0 y
- WSACleanup();- P$ n6 Y3 B# i, L& D/ G3 Y) s
- }
复制代码 求懂的高手来解答一下。
- H1 }/ e. z+ }7 K l谢谢了!
& R5 q7 u! S# Y( J# u; } r& a0 t; o/ X+ h
& K) U: P2 u/ o6 p( G$ `' @" o' n" u% D5 d+ C* _- o
|
|