管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
/ F& G9 ?* S! w' c4 O我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
7 w+ w8 N0 O5 A! J" O3 `Talk is cheak , show me the code.
5 D4 t& F' g" g) p: o3 z+ l$ N服务端代码:
* H" O2 M( j+ o. W" ~' m! i* p- #include<stdlib.h>
3 |: ]7 Y7 ^$ D( y1 C5 c; v: g% f - #include<WinSock2.h> v+ d8 `' ~- X7 |" O
- #pragma comment(lib,"ws2_32.lib")
* d% h4 k( p4 X8 v$ ]/ I/ V h - int main(){0 Z+ ]0 h$ r6 J, @9 T. j/ b. q
- WSADATA wsd;
, Z# ~" g" [1 e - SOCKET sockServer;
# n5 ]- E7 {( w+ ~4 A3 q+ [ - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
7 b6 K/ i2 Q! r4 i) B - SOCKET sockClient;
: k) {5 p0 S$ H. q0 O3 o, L% I( p& ^ - SOCKADDR_IN clientaddr;
7 c: @7 U( K2 C* v( ~ - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口3 n, f. O. P6 ~6 S5 l
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket _( }/ g& y. B* r1 l$ N/ O1 r7 R
- * X" X, p4 d1 j/ G- c
4 Z; U) s2 f" h4 B# w- C( K! D- if (sockServer != -1 && sockServer != INVALID_SOCKET){; ?4 a7 S/ G& v
- printf("Socket has been created :%d", sockServer);
3 ~$ L c: A4 ]( j - }- o$ C. J& y& @( ^* x; |
- else{3 D0 @0 d2 q. G' ]7 [
- printf("Socket create failed.");' v7 B: z% n4 W. T/ K" v
- exit(0);3 @" F9 N; A. b& ?) V
- }8 M; S( V) D# c5 b# x+ ~& p. f- c
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
5 |; M7 z6 k* a2 [( G - serveraddr.sin_family = AF_INET;0 n6 x/ g) X- w u
- serveraddr.sin_port = htons(6000);//绑定端口6000
* W) ~8 v- A8 _* u; X - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));# O# P& s3 D. K- ^7 @: b
- char recvBuf[100];
. i: y! v+ h: g" K1 W7 b" c - int len = sizeof(SOCKADDR);
5 b0 Y; ^5 a# a7 \5 l5 v% k - listen(sockServer, 5);//5为等待连接数" S4 e$ \+ B$ [
- while (1){+ d, e* Z8 v V$ n7 E. B6 Z
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
) Z, p1 ]1 d( s* g: c - //接收客户端数据7 O6 K+ v' {, l
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
' ^ i8 N* M- I2 h1 C - printf("to me:%s\n",recvBuf);
8 L1 R& v1 D: p+ }, l - memset(recvBuf, 0, 100);7 {/ T2 L1 a" p; T
- }0 j/ w2 P e. h7 F: d" x0 `
- closesocket(sockClient);
2 c0 `7 y8 z6 y5 A - system("pause");
^2 \. n& c# z - return 0;& q+ o0 s9 j6 S+ u. \
- }
复制代码 客户端代码:
& o* h! E* e! R# e, M! i/ E- #include<winsock2.h>& F5 n$ F- V1 K* U: o' R
- #include<stdio.h>
5 [7 c4 W1 I3 \ - #pragma comment(lib, "ws2_32.lib")' P7 z0 T1 F& Y. ]' q" U
- void main()
( q$ Q1 W8 h! G8 Y! ~4 z- I - {9 x6 u: p+ C# I) x
- WSADATA wsaData; Q3 K! e) z% e: ]; Q
- SOCKET sockClient;//客户端Socket
) M' |8 l3 A" r4 A - SOCKADDR_IN addrServer;//服务端地址) L" q4 Y# ]! E1 v7 Z
- WSAStartup(MAKEWORD(2, 2), &wsaData);) S4 u/ O' H8 y0 P+ o) y- K3 W
- char message[20] = "HelloSocket!";5 f* G) G, N0 B3 C7 ?1 R5 K
- //定义要连接的服务端地址
3 o3 {# R# C$ g/ U+ U8 A, c - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)& j3 ]) v/ @2 V6 Z/ f
- addrServer.sin_family = AF_INET;
* w# k' S- h0 i - addrServer.sin_port = htons(6000);//连接端口6000
2 @" \" Y- }1 l3 j" j% Z - //新建客户端socket4 N/ Y5 O; e) V3 g" M6 ]
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
; a: b- b! _9 _, J! j9 s& ^ - int s = 0;
! E3 C" y: o9 h3 Z9 n) W9 Y - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
! M, y2 X3 z6 f3 E
: s' N+ k' A: D) P- while (1){
: V8 b1 t6 w/ a% _+ ^) ~ - //发送数据
. {/ d# j4 q; [ - int a = send(sockClient, message, strlen(message) + 1, 0);
; I4 h" m0 l8 |2 {4 [. M9 U4 J - printf("to server:");
2 J8 H, ~; \* }$ N7 N5 s3 V - scanf("%s", message);
p7 N/ y3 V) `" f4 v E, R- F
( ]! l- t) x- [; ]/ h+ l- }2 F' V! R$ z r3 H) M3 V! M
- //关闭socket; ~! m( j# o. f4 H* v6 z3 u" J
- closesocket(sockClient);. \# `5 M) z( H6 L G
- WSACleanup();7 M2 l6 r9 u- X: x! P
- }
复制代码 求懂的高手来解答一下。
s. ?* W* H* [: R8 l! {谢谢了!* y4 ^" H4 A* G3 |; Z
; P' z- J& R' j0 d* K
; Y6 ?+ o! P, p
" j1 b5 F. Q/ {0 X% X; S |
|