管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
/ G" g; X; r8 n/ r4 d5 w我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
, K+ p6 z: `: S6 q( kTalk is cheak , show me the code.
3 q* W7 g$ p L; O7 W0 ~! Z服务端代码:
\# W! W( c4 A9 P' \- #include<stdlib.h>
! t( R; b7 {. C' \ - #include<WinSock2.h>
( K* Z. C" ]/ W8 V! j - #pragma comment(lib,"ws2_32.lib"). n0 m8 j+ I" Q1 p! r
- int main(){
( d3 t$ o/ n$ t3 I$ N - WSADATA wsd;3 y' D/ v% q E) v
- SOCKET sockServer;
5 c* ^ Z; ]1 g. x+ Q1 Y- b- C6 c - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
$ X* h. j: F1 f0 T2 w8 v C" P" Z - SOCKET sockClient;
6 q/ o1 M+ l9 s5 m - SOCKADDR_IN clientaddr;
C+ W0 b8 R8 ^& J - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口/ S! x) [! F6 D: A
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
. J- {7 y: I7 w0 d0 N
- @: v! x9 K- _4 m& H) l9 K- 8 Q3 B9 Z) \ f6 O
- if (sockServer != -1 && sockServer != INVALID_SOCKET){2 L/ V. E5 m4 }7 T
- printf("Socket has been created :%d", sockServer);
9 \, G) m& W% a: ` - }5 O& @' ]8 a7 n; u1 x
- else{
; [0 V& a* W' u* U9 d6 @( ~4 F - printf("Socket create failed.");
. R2 B' N G7 ?8 w - exit(0);7 d% K2 Q- Q, s# G6 S
- }
; X# w& S. \2 q2 D3 o# m - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); s; A/ @0 J2 ^0 V5 e! ?
- serveraddr.sin_family = AF_INET;: l+ L3 f2 }1 d9 W$ o
- serveraddr.sin_port = htons(6000);//绑定端口6000. u f% q/ G$ V. i$ N
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
$ n" r# k1 z* D" V( x - char recvBuf[100];; h6 ?2 L( w* b2 ~0 S6 ?
- int len = sizeof(SOCKADDR); J4 o" G3 Y& V+ u+ k0 r$ D0 x
- listen(sockServer, 5);//5为等待连接数2 I8 P0 ^ E" ^$ A
- while (1){5 A, \# \( ~1 |4 P/ y3 t% G
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
Z2 w5 q, W2 N. w. P - //接收客户端数据
! m% }7 e1 {( B6 ?1 d0 t ~ - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
" y' ^ D, O( D4 E0 W& o - printf("to me:%s\n",recvBuf);$ N, _4 ^2 v+ V3 S) E
- memset(recvBuf, 0, 100);1 D0 ]5 F* e% Z/ ?2 F
- }
% f' c; M1 r) b4 R3 F5 a - closesocket(sockClient);" F) b! @. f0 g. `8 S
- system("pause");4 \. n) o: U% S+ g
- return 0;
+ [5 {" q4 J6 D- f5 {! ]& x - }
复制代码 客户端代码:* F8 b4 ?' l" v9 s5 ?) T
- #include<winsock2.h>: R5 V. f- S# C4 m7 |
- #include<stdio.h>
0 v4 v4 D3 {# x" p# K* } - #pragma comment(lib, "ws2_32.lib")
7 V \+ R' w, E$ B$ Y& Q2 q - void main()
. n% E* m4 z) ^" g. s$ R - {
7 q, P4 x, A6 L# g6 T- V - WSADATA wsaData;6 S6 U; J+ M. e) {: v: u
- SOCKET sockClient;//客户端Socket$ |! r6 d A w, ]7 `: R
- SOCKADDR_IN addrServer;//服务端地址: ~( e+ [, [; i$ e' v' ]+ [7 ^2 K
- WSAStartup(MAKEWORD(2, 2), &wsaData);8 y1 z8 y$ \8 p" }- l* ?) q
- char message[20] = "HelloSocket!";* X0 G& D6 m4 y6 r# ^
- //定义要连接的服务端地址
8 l0 i9 N, |: S8 Q9 q* V b - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
6 f" k* _) x7 Z4 Z. c# S: G4 X - addrServer.sin_family = AF_INET;# y! A% l6 G2 d& J) G+ Z, i" X
- addrServer.sin_port = htons(6000);//连接端口6000
0 F" L3 j$ T" K: Y# R2 h* i - //新建客户端socket$ m" X+ E) L; j a* n+ X! Q
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
, \& |- r" ~( m - int s = 0;1 P2 _" K9 m6 k
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));' ]5 x$ i0 \. o
- 6 D6 ~( P6 G/ _/ b' @ Y7 D1 a8 h
- while (1){
0 H" W1 z! z4 l: Q- x; G! V9 p1 W! h7 b - //发送数据
4 w3 r1 S4 _# a7 X9 L - int a = send(sockClient, message, strlen(message) + 1, 0);- G9 t5 f' h$ Y( V8 w1 p
- printf("to server:");$ K: m" g3 t+ y% }# L b+ q, O
- scanf("%s", message);
" P/ X: x, p7 M; f - " \4 h, L/ C9 A2 }
- }1 R$ V, P9 M6 x1 m/ w; y; W
- //关闭socket# Z# Y) h7 I$ K
- closesocket(sockClient);5 y! H+ U& o0 _. ^& z2 K4 d; N
- WSACleanup();
2 b7 w+ f6 i( l6 e' W; o - }
复制代码 求懂的高手来解答一下。 ]: V; r3 H: }
谢谢了!! J: b1 S& n4 T, T# F6 M
5 _4 u' t8 A+ a4 U. C y# ^3 t4 b
' S+ S- H4 x( C4 S& F3 l4 v t% O. [$ m
|
|