管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。! h0 r0 E- ~2 z8 A+ d' @
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
2 c0 T0 k& p1 W: R' _2 \# j- @) vTalk is cheak , show me the code.
, E7 ^% Q' a( c7 f5 S) R, N: ~服务端代码:
! O+ p' w3 B Y& O. {9 \- #include<stdlib.h>- J7 V1 N( W8 M7 i4 p0 |
- #include<WinSock2.h>
- e4 g0 w, C- Z - #pragma comment(lib,"ws2_32.lib")
! Q& N$ t" c+ W& w/ q - int main(){
1 C) p* [1 B5 c5 r; f1 z - WSADATA wsd;
# D6 y* G; P0 m7 i6 d1 r - SOCKET sockServer;' P7 J6 C V! \
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号, C3 C' |$ x' J, A6 n) H; J$ M' k6 [
- SOCKET sockClient;
' \% P: `7 ~9 {9 D3 S! B: | L% E - SOCKADDR_IN clientaddr;
9 S! ], T5 Y0 o! Y( p3 T - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口" `7 q6 ^# S# f5 l4 J5 }
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
, S1 O2 _& E; n" ~. ~* ^( s3 z* X/ z - ! P- H8 f: Q- ~% i) s% l, Y" k
- + ^7 |$ x- `- u: S) @
- if (sockServer != -1 && sockServer != INVALID_SOCKET){: [: N) W. K1 t; k
- printf("Socket has been created :%d", sockServer);
, d. }6 K5 ^! _+ q! ]* v5 s7 \ - }
" l. B4 ]3 u) o# `6 D - else{( B; z" L. Z! a
- printf("Socket create failed.");1 | z- ^* `9 D/ k1 k9 u4 M7 J
- exit(0);$ i1 {. Z. |$ U9 ^3 u
- }
- @3 e1 V B3 U8 W/ _9 q - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);- ?7 [; k7 w; L x3 o, h
- serveraddr.sin_family = AF_INET;
3 W/ J, a: {. b. [$ b5 E- R - serveraddr.sin_port = htons(6000);//绑定端口6000# m* R h% @' n* |$ f8 P) c6 S- c
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
( n$ W% o& ^ k* m1 d - char recvBuf[100];! v+ v0 A% @. N! {
- int len = sizeof(SOCKADDR);- h; Y5 v6 R* ]* y1 [
- listen(sockServer, 5);//5为等待连接数
* @5 b9 s# F, P; |+ R4 | - while (1){6 O# ^! w6 \( a i: f$ l
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
9 r1 Z0 h ^: |1 |. R - //接收客户端数据
+ t' }+ B2 x$ x% } - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);( Y! c) |# S$ A `
- printf("to me:%s\n",recvBuf);
9 Z$ I; ^. T, P6 _' T - memset(recvBuf, 0, 100);
4 ^4 X! X6 o7 \0 `% `& k& \ - }; z, D% A8 M- H" r
- closesocket(sockClient);8 p" ?5 S# f* m8 a! M9 Z
- system("pause");
7 I2 N3 }8 i) V, o! X \ - return 0;+ @: N1 A% N, L5 K( t
- }
复制代码 客户端代码:
# s0 G/ J0 x) A% j; F. ]- #include<winsock2.h>
2 f$ ?- k2 r. M$ v6 ?2 X, u8 s1 N - #include<stdio.h>
* g7 q" N/ F( e( h0 l - #pragma comment(lib, "ws2_32.lib")/ s& ?" g, z9 u) q& g- U( e6 Y
- void main()6 v, A/ }* J" y0 Z7 E2 {8 E
- {1 ]6 g$ C: [/ \
- WSADATA wsaData;
2 _. S6 V' z0 h3 d' I. i) K+ e - SOCKET sockClient;//客户端Socket* S. G- O0 M+ y9 p% C" z6 i) I
- SOCKADDR_IN addrServer;//服务端地址
$ y* l# `. X& T( y. g - WSAStartup(MAKEWORD(2, 2), &wsaData);! K) ^; I" A% ?2 a8 X* t
- char message[20] = "HelloSocket!";
O3 }9 W* k& i* k' o( [9 G - //定义要连接的服务端地址! K" i0 F) K+ c; C, [+ }
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
8 X6 H* |* M6 c; L - addrServer.sin_family = AF_INET;
+ ]$ O4 @! B- `4 Z3 L - addrServer.sin_port = htons(6000);//连接端口6000" d2 E/ P* c* s; ^% q8 z. ~
- //新建客户端socket- s6 e4 @' R- C0 k0 P; D. X$ t+ p
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);6 h& c5 Y, R; I+ D: _7 J' u
- int s = 0;$ b, U" O: |9 L! I6 n6 s
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
- W9 @* e8 o" k/ t - % b' ]$ A# V3 @1 m" ?! x
- while (1){
, O+ J' \/ F$ Z - //发送数据% P4 D* Z7 @1 J& `
- int a = send(sockClient, message, strlen(message) + 1, 0);
! s2 {2 q& t" l0 d: } - printf("to server:");! l3 i% g2 X2 d7 B5 `
- scanf("%s", message);6 e" C/ ]2 a' C. U& @; U0 y
" V6 G2 Z; j9 | v# n% A, Y- }4 b7 A. X( l$ O# F( g% U
- //关闭socket; V& C3 a' ?" L
- closesocket(sockClient);4 P7 E3 ~9 I# C
- WSACleanup();' F" o G: c5 U( v, q2 C
- }
复制代码 求懂的高手来解答一下。
0 T9 n7 @8 J' G+ o谢谢了!
2 t: }- ?9 Y q6 b o. S$ {8 d- f' c$ ~# V% z9 ]
& F' C: b! f( A& [1 }4 [/ ~6 c, W
( n8 F, ]* I& g3 U0 t" Q3 [7 B" }# O |
|