大家好,感谢你的回复。
# l1 U: [ h2 B1 H- t我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
/ m$ \! m, [. _& I# X6 Y4 r; jTalk is cheak , show me the code.
. l- H, s6 ?) d" }2 p服务端代码:
; S' b- t/ D8 K; L0 \8 u- #include<stdlib.h>, A/ K7 n1 c& U* t, |2 a/ U
- #include<WinSock2.h>
- x i' U$ {) u" @2 a- t) a - #pragma comment(lib,"ws2_32.lib")7 i* `1 M& ]3 f
- int main(){
$ {( h. k V/ Y O8 |! r/ @ - WSADATA wsd;5 A0 k/ q$ Q9 x0 K& d6 ]2 K
- SOCKET sockServer;5 r0 C; c( [! x' I' a# r
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
$ o* z# u0 ?3 Y9 C7 E/ x8 v/ p - SOCKET sockClient;
% [, g6 ^, g3 l9 I" ?% E$ R( D" x* J - SOCKADDR_IN clientaddr;5 a( ]+ ~% M/ ]# H- M0 u# F
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
0 F- I# x8 i9 w - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket& l" X9 S0 r2 W9 P3 I# E
1 D- a: c# F6 [! ^. j! p- # [4 L- x" @" k0 T/ B
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
K, d) W2 W5 W& |( Y! G8 { - printf("Socket has been created :%d", sockServer);8 l! g0 W& c: K. V l
- }
$ h! r1 L9 h3 P - else{
$ I* g3 `) `& u+ ]( f - printf("Socket create failed.");
0 ^' g- V, f, w" k5 y0 T' l" N - exit(0);
4 ?1 \: O+ b; V) d+ y - }
4 A* J b$ T# E' n - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);; p% U+ v# y7 e, I9 j" S
- serveraddr.sin_family = AF_INET;9 b7 K( ` K; |& N' G; j- P% y% ^
- serveraddr.sin_port = htons(6000);//绑定端口6000
1 o) H) {% Z0 P - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));1 [) N% y. m, F
- char recvBuf[100];
" J+ {4 ]8 D' C - int len = sizeof(SOCKADDR);
( [. K1 J; w& `/ ^( C - listen(sockServer, 5);//5为等待连接数
, ]+ m+ n* q3 W+ P/ V7 b - while (1){
. H( W* d* m% {; d* s( | - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);5 P; C7 ?6 ^- p: F$ [6 }1 a" C7 _* e
- //接收客户端数据; `9 f9 Z& x) s% k+ N7 \
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);8 z' O2 N& P& \' c
- printf("to me:%s\n",recvBuf);& n( m" S" [$ t& k5 l/ t
- memset(recvBuf, 0, 100);
0 q( R9 n( |2 R' H/ ` - }# ]6 Z4 g b4 X3 v& E4 I6 N
- closesocket(sockClient);6 G8 S6 E% Z+ G' O5 f" Z
- system("pause");5 X( ]; _3 i& h
- return 0;- J- A+ O+ [; a% ~# R5 y
- }
复制代码 客户端代码:
' C1 X% i$ J: u0 T- #include<winsock2.h>
; v2 l/ q5 _, M, P2 z$ A) K8 Y+ E - #include<stdio.h>& ~8 c. ]6 X, p: r8 k
- #pragma comment(lib, "ws2_32.lib")
9 w% y# C: {1 K) h; a% h& X! B - void main()
( V+ U. K6 e1 q) x T, \ - {
9 O5 A& R* M/ L* k" z% t - WSADATA wsaData;
/ C. I5 a9 q' K y: F - SOCKET sockClient;//客户端Socket4 |7 J9 K5 F; j- U( b
- SOCKADDR_IN addrServer;//服务端地址
9 @" ]* f& t ~& R& o9 F - WSAStartup(MAKEWORD(2, 2), &wsaData);
Y1 @# e' Z1 K. P - char message[20] = "HelloSocket!";7 Q X( T1 {7 w1 J/ q, c0 Y7 u- K
- //定义要连接的服务端地址
& P; W8 e7 i! L6 [* F - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)) E7 R, r; |) _# k+ }
- addrServer.sin_family = AF_INET;( i# r2 L( O% X* g/ D& X! A3 ~
- addrServer.sin_port = htons(6000);//连接端口6000
$ {) y5 S. i7 E7 B5 [, {3 z2 r+ a - //新建客户端socket
3 x6 S& s g* V( ~1 [ - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);# h/ [0 d# e' U. j) D( d3 r4 B
- int s = 0;$ d m8 e' R. ^/ Y1 ~
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
g$ q+ q2 o3 G7 e2 }; J! h2 o
( @& ~+ B( E" K- while (1){- M8 ?! p$ E( y4 r
- //发送数据
* q0 P$ {! w8 @5 K) f - int a = send(sockClient, message, strlen(message) + 1, 0);4 [" U) @0 r2 Q4 ?+ I% t0 c) {: M
- printf("to server:");9 ^0 K g8 y$ X$ ]3 p
- scanf("%s", message);
" M7 h/ A% o" s: E) q
5 j$ Z4 D. ]& s v! j5 c5 @1 ^. h- }
; R8 t' M( x$ Y0 W# k0 J - //关闭socket
8 _) q9 b$ ^7 k" W8 v - closesocket(sockClient);: i" P/ U) x! B# a- \& N: t
- WSACleanup();
+ ] u# U1 e; U, h' v+ X R - }
复制代码 求懂的高手来解答一下。& k) V( z( [0 @6 s
谢谢了!
) _' H+ q/ j# ]/ g2 z" j+ r' ]! _4 K2 `
+ D7 \8 s3 U' r& c0 r8 i9 x# y& g; c8 C# }
|