管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。3 X- V' |8 i6 f/ C0 p
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。: z% j) @6 G" G: S% k) ]- c
Talk is cheak , show me the code.- F3 k5 {) j5 [$ L
服务端代码:% U7 Y5 U: @: b0 J0 j, e! @
- #include<stdlib.h>. [5 G( `) E# |' v' o8 P
- #include<WinSock2.h>) x) z* m# g# H% D
- #pragma comment(lib,"ws2_32.lib")7 w* d, @( t- C6 e' V; o) |( X
- int main(){) P) m5 s7 {2 C3 d9 E
- WSADATA wsd;. K7 c3 r6 M6 g: g
- SOCKET sockServer;7 S/ W# \% z: S- s
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号 k9 h5 W+ j" I4 m+ c2 g
- SOCKET sockClient;
( F1 ~/ o" } X" o - SOCKADDR_IN clientaddr;
. \$ b$ x0 _7 J7 d - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口7 H8 o. C9 K. [* p# I+ A, ^9 u
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket5 }2 i1 v( ]& p2 V, {0 e, F
* p' j( K" R3 V- ]$ m
1 p# ^& k* W4 g! A1 {- if (sockServer != -1 && sockServer != INVALID_SOCKET){
* f; S+ l4 O& |: S" V! ^* [' K( Y( H1 a - printf("Socket has been created :%d", sockServer);
2 k" {2 W# j" b - }1 Z+ k0 {: O9 t
- else{, Q& }9 k0 Y# S9 Z% m& y% Z2 C$ L/ Z
- printf("Socket create failed.");- l/ @+ C$ b; l" ?
- exit(0);
5 e1 {2 b' g/ g; q+ v' x - }
# z+ e! x; `! r3 | - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
* w5 o { i/ H( J5 S - serveraddr.sin_family = AF_INET;7 V" l. ]3 ]! R
- serveraddr.sin_port = htons(6000);//绑定端口6000; d: `/ |* @1 ^0 K, h" z a" c
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
) w/ r! P1 `: x7 [: i+ d - char recvBuf[100];
4 ~ _8 `: @+ N) k' ^/ a+ q* X N - int len = sizeof(SOCKADDR);
0 w7 s) m6 I7 F% o$ E$ M% [ - listen(sockServer, 5);//5为等待连接数1 U/ J* ^. h' ]/ u7 o4 ^
- while (1){
2 k2 O% X# K/ y8 u5 T7 _: y6 M6 ?/ I - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);0 u# @* A+ i* X' E
- //接收客户端数据7 e6 w( {* b9 b) m! t5 k Z; H
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
' F9 G/ ^8 g& `% O, H( k; _% E/ c - printf("to me:%s\n",recvBuf);
& w! s8 w; Y9 C8 I9 _ - memset(recvBuf, 0, 100);
" {! H) d6 H! z - }
" ]4 q- V7 r+ b- w+ b - closesocket(sockClient);
0 ]' ?1 c5 U% I9 `$ P+ D$ a7 X - system("pause");# a) l: ~8 z$ w. }! k2 k7 g
- return 0;, Y- { K; {) n9 I. `: b
- }
复制代码 客户端代码:. W) t% R3 }* P7 [0 w8 |
- #include<winsock2.h>
9 |, D# n* C( I4 s( I+ w - #include<stdio.h>
) J0 s: J4 k* Y9 }* [- a - #pragma comment(lib, "ws2_32.lib")9 N& ?6 J+ {4 e# M
- void main()
6 ]. ?2 b) |. M8 D* [ - {/ b- v' M, s4 O
- WSADATA wsaData;
0 K9 `" `' I( r- N: A, p0 j: r - SOCKET sockClient;//客户端Socket
; V% v6 j$ H8 {0 j6 Y( u - SOCKADDR_IN addrServer;//服务端地址
5 C$ G: f4 s2 m4 M% H - WSAStartup(MAKEWORD(2, 2), &wsaData);5 z) s* f* q* ~" t' y" k% l/ W( U
- char message[20] = "HelloSocket!";) C& N2 N2 ~! l
- //定义要连接的服务端地址3 W4 I) L( H" M$ ^% e I
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)# M$ P4 ~% @* V$ A2 A4 S7 n
- addrServer.sin_family = AF_INET;4 W; V9 p1 V7 b; D q) {! y
- addrServer.sin_port = htons(6000);//连接端口6000
$ F* u' H& L5 O/ F9 V - //新建客户端socket8 @- O8 ]# z1 {
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; J1 _/ P9 O; D! D5 L9 Q
- int s = 0;
$ O( S" Q M4 n+ k" n8 ] - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));4 g- c% k0 u! a, C
- 6 G' s& U4 g. [4 T# z$ |
- while (1){
# |5 @8 c) w# ~9 x" A) `5 y) Y - //发送数据
" o, o% ~" b& U( C - int a = send(sockClient, message, strlen(message) + 1, 0); s; Q5 O0 ^' P* |2 ? z
- printf("to server:");, t8 x& X8 S/ Q7 x# A
- scanf("%s", message);& S0 ?; n+ \) b% w+ Z5 ]
# H. p" t5 v: |8 z- }
7 Z' D% M7 M2 F( A. I7 E) S* i. N - //关闭socket! f3 ~. V( z' ~9 M M( E
- closesocket(sockClient);# p0 s( o: R3 _- Y
- WSACleanup();
! x/ Y* E- v( d# u w/ Y - }
复制代码 求懂的高手来解答一下。: W4 a$ L7 s- D8 X
谢谢了!
! |! t) b( o) C- V/ O7 M' v: I
. J5 I- `; S$ b' X6 k, u" a3 S8 b( `/ ^' \. N/ G1 v
l5 g$ G7 T7 C' ~" @* C
|
|