管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
, ]; a, i; A) r' {我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
) h. v5 L0 l( X) S+ N, c/ ?6 NTalk is cheak , show me the code. ]5 |3 j1 C7 W" m1 R) u: ^
服务端代码:0 |" y" g* n/ b+ x- m
- #include<stdlib.h>
8 w/ v" h" O" h5 @) {9 F3 l - #include<WinSock2.h>
- S" x* ~& ~4 v, ~ - #pragma comment(lib,"ws2_32.lib")
9 q" [, A* Y( o6 e+ K; ^ - int main(){
) ?' N: t* V6 e - WSADATA wsd;* e. v1 W8 \3 w$ {
- SOCKET sockServer;( i# @& M& g7 y: k- z+ Y" Z4 \, a
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
- j* x% k) U: Y V, T - SOCKET sockClient;5 M$ ^; @, Z' F3 f9 E
- SOCKADDR_IN clientaddr;2 }" z* `: Z# r; Y$ ?3 P
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
7 A0 q* g- d0 z- i+ _& [4 X- _ - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
; g k2 Z' k) r9 x - ( N& _+ J$ m6 e ]
- c# M& t, D5 n! c9 |
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
# ^+ w/ S6 k* t3 J - printf("Socket has been created :%d", sockServer);
( w: x Q2 Q, a8 h - }6 O( H- S. a9 }6 Z/ c$ O
- else{
0 u" `: Z1 B8 C! ^6 U - printf("Socket create failed.");
. R) k- z" L" a7 l9 F; e - exit(0);
9 |* X0 `& f/ s" @3 w - }
3 l1 Z% w) p, M+ U0 B - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
! C, V0 w+ O' a9 k - serveraddr.sin_family = AF_INET;0 j* l; b* n) X, `; g! `! }, y3 _
- serveraddr.sin_port = htons(6000);//绑定端口6000
& N" a5 z" d4 r2 G3 t. {- z6 ] - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
2 Z# B, J1 f2 H; k/ S - char recvBuf[100];
# Z; T+ S7 F8 P8 [ - int len = sizeof(SOCKADDR);
$ `0 o* E ]6 E. v9 L3 e - listen(sockServer, 5);//5为等待连接数
4 K7 @; w' S/ N: z - while (1){0 S4 _: t! C) r6 n% ~
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
3 x( U; P$ F% R# y, x+ x2 f; } - //接收客户端数据! S+ C [8 _9 [, f9 e3 o
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
" \( K) p0 D, Q - printf("to me:%s\n",recvBuf);" J4 J3 ~! g8 t2 A
- memset(recvBuf, 0, 100);8 [4 s3 J9 f8 z: ^7 B2 [. F D0 |' K
- }/ r; K# n4 _8 t" Q
- closesocket(sockClient);
& n; ^5 J1 ~& c- o - system("pause");
3 o3 {7 t0 B: R3 N5 @ - return 0;
0 e5 E4 c- N2 N% Q' }5 a - }
复制代码 客户端代码:+ n3 w; z+ i4 G- u5 d5 W
- #include<winsock2.h>6 x( d. i- u- r) }! }
- #include<stdio.h>( n7 L$ K! b4 w9 t9 f \
- #pragma comment(lib, "ws2_32.lib")
1 J- p7 q3 i0 { A8 z2 E - void main()
5 w% m5 N( s8 K( A( l, Z - {4 z. n% r3 S) ~3 v; P! S
- WSADATA wsaData;
! A2 R1 f/ }. t5 |4 T - SOCKET sockClient;//客户端Socket
0 \1 x6 `& ]) y2 b - SOCKADDR_IN addrServer;//服务端地址
9 C5 u3 x, e! |+ ^% c - WSAStartup(MAKEWORD(2, 2), &wsaData);5 p9 T5 E! ~0 g( i
- char message[20] = "HelloSocket!";5 w3 ]9 a) D9 W& P' D
- //定义要连接的服务端地址
. F) a' a2 p3 e+ m" H - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
2 u3 V$ a' B2 O+ l - addrServer.sin_family = AF_INET;
) M) T4 t0 x6 x% x! P; p4 b - addrServer.sin_port = htons(6000);//连接端口6000' q8 J" i- q3 c. z
- //新建客户端socket7 T7 q4 [# k3 w) g
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);! w* O3 C3 f% H0 \ _- H6 U
- int s = 0;* R7 R& y z- O3 C$ l
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
, ]& Y% M: M* s* q6 `& z2 D - 8 J# H" S: U4 j3 q
- while (1){: w9 I) Q- z% @+ k( C, l2 ~$ h# [' H
- //发送数据% X2 s/ a* p& T* s1 A
- int a = send(sockClient, message, strlen(message) + 1, 0);
! x& d+ ]8 t8 R- f - printf("to server:");3 |7 Q; F w1 z' M7 r
- scanf("%s", message);# D5 \0 ^. \5 t0 t5 @3 v
- 3 r; \! n; C8 y }$ z0 L3 T9 H
- }
; P$ s9 D" g; A - //关闭socket) R8 U9 g' O% }$ L/ y
- closesocket(sockClient);0 k4 O5 J+ R; K! a( ]% H
- WSACleanup();8 W8 `) A' @" o8 }! t: m
- }
复制代码 求懂的高手来解答一下。
' w) m- J: K* G' ~6 N谢谢了!
0 e5 F. g0 J$ L. `: E+ B( a0 b" }0 F, ?8 w4 J
7 u7 S* X& g% N) _( f/ n
$ M1 w0 K5 u7 V6 x @, m/ ` |
|