管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。 j8 {6 e) q5 i% W5 H& y& M" w6 u
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
% y3 {. z& k8 G4 F/ d" m( lTalk is cheak , show me the code.3 b; h; ~1 c4 W2 M& O
服务端代码:4 L, H* @5 O3 [# ^4 f; Q8 |2 K& g
- #include<stdlib.h>
: K* V1 j% z* q/ q0 `8 l - #include<WinSock2.h>! ]2 e( ]4 e- W) a7 a- _8 |
- #pragma comment(lib,"ws2_32.lib")
& N* S0 G# ~8 N6 {3 G$ G - int main(){! Z0 D9 h1 S+ A' p/ P
- WSADATA wsd;" K5 Z4 O. }7 J
- SOCKET sockServer;- M1 m( h+ [0 `' E1 z3 i( F
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号2 z" S, M6 {; Y8 V5 l6 T' k/ K
- SOCKET sockClient;
5 C; x. J/ d8 K5 L3 X - SOCKADDR_IN clientaddr;& ?7 F7 s5 Z- p" Z2 ]" z
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口 c" }) n5 @$ P$ L' m- ]
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket% S n" O5 m& q ]* y! Q
- J% L6 B1 }( I1 O2 t- 6 W! Z0 _5 I) s" v; ^# c. Z
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
" J$ h( H8 c2 } - printf("Socket has been created :%d", sockServer);
" u+ b' Q3 f0 r2 l C - }8 P/ m+ y0 }( F+ [7 ~
- else{- z( V7 O7 m/ F2 v1 k6 Y* Q( |
- printf("Socket create failed.");, ^$ P" b' }8 s* Q, v0 X
- exit(0);4 U" x1 d! u+ P" \/ M8 }
- }# j; |7 |! w& R a4 a
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);( }! T5 v( R4 o( u7 C) N: _1 V
- serveraddr.sin_family = AF_INET;. W3 X }- e4 b8 o4 R
- serveraddr.sin_port = htons(6000);//绑定端口6000
7 Z! h- A1 u; E5 p8 F - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
! x5 B. g3 u' y }" o - char recvBuf[100];% I' P7 } I \ Z3 ^7 [
- int len = sizeof(SOCKADDR);7 A) V2 e9 O: D7 [( O
- listen(sockServer, 5);//5为等待连接数
5 _& q8 x! r3 f0 V - while (1){- g7 F9 A0 W; {2 ?- l3 ^+ p/ I
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);4 L+ c% W8 ~7 g; i* Q( o
- //接收客户端数据6 r9 P8 [* e: Q8 r
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); E$ c* i7 G4 b, }6 H
- printf("to me:%s\n",recvBuf);
6 P8 ?9 P& O, D4 O/ o - memset(recvBuf, 0, 100);" a- W. ^2 b) ~7 f
- }
7 V+ I" h/ n& Y0 u& Q2 N* d - closesocket(sockClient);8 a9 p+ i% ^" H% z4 ?; ~
- system("pause");- X" T- ^5 O0 \% _, O* b. q, I
- return 0;
& U0 j$ J1 n; N# a" A) t6 `* [ - }
复制代码 客户端代码:
' X, o' X, a% c8 g2 M/ X- #include<winsock2.h>
3 ]8 `' X" L* D0 u! _) I- f9 D- @ - #include<stdio.h>
/ Y5 g- S5 a9 H/ ]4 Y - #pragma comment(lib, "ws2_32.lib")
- _, B# ~ ?: A u# C& a, H - void main()+ t9 X- d$ m. z7 l$ e
- {) h, W* @, m! N
- WSADATA wsaData;
& d8 K( Y) y2 x9 `5 l/ Z; @ - SOCKET sockClient;//客户端Socket1 u) ~$ h ^2 Z; K6 ?
- SOCKADDR_IN addrServer;//服务端地址
! t- m+ b- H$ L. U2 r, z C; n, V - WSAStartup(MAKEWORD(2, 2), &wsaData);: H5 M4 s; k6 e9 p* w3 m
- char message[20] = "HelloSocket!";" \5 w7 V2 G# w' l
- //定义要连接的服务端地址$ _. N7 D5 t+ ?
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
- n0 N$ H5 o1 K; X - addrServer.sin_family = AF_INET;
! K9 m4 a2 y/ u& F - addrServer.sin_port = htons(6000);//连接端口60001 Y N- A( C$ t% {8 z
- //新建客户端socket& K* _5 t, O8 ~2 h
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
* F/ m, [( `2 V' F) S - int s = 0;
$ i" X+ c; }+ L0 M2 [+ W- T9 z/ M! v - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));+ ]! Y. e \/ v0 G9 R% L
( D) ~3 @5 _& X- while (1){
) C+ t$ s+ w. P; D- i4 N, v3 y - //发送数据
& w/ i: c9 j- |% ^+ W1 l+ \. S* ] - int a = send(sockClient, message, strlen(message) + 1, 0);
4 I$ A; `# i/ v' F+ J4 e* m: n - printf("to server:");2 s, ^$ @ t' {( ~1 I4 T
- scanf("%s", message);
; F2 N$ r: s" c5 f3 R - # f* h' h: L& k2 h9 ^- \4 ?
- }
' y# F7 B3 a: P$ A7 a0 c& ?5 [2 D _ - //关闭socket
. P. `5 c5 m ]$ B; b2 J$ v2 ~ - closesocket(sockClient);5 o# H( _- h/ @! O6 N5 c9 E
- WSACleanup();1 s& `& d; D* O
- }
复制代码 求懂的高手来解答一下。. N* x5 D! s/ p' t$ D: t) g! w2 j
谢谢了!
- E& L7 x& f& Q4 U3 b% r# Y0 N% n/ H: H5 ~( D
' b. g; v% E/ G: G# i, M
( K/ p% I! ]2 S8 o
|
|