您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10527|回复: 2
打印 上一主题 下一主题

[C] C语言 socket 编写简单服务端客户端通信问题

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。  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
  1. #include<stdlib.h>
    : K* V1 j% z* q/ q0 `8 l
  2. #include<WinSock2.h>! ]2 e( ]4 e- W) a7 a- _8 |
  3. #pragma comment(lib,"ws2_32.lib")
    & N* S0 G# ~8 N6 {3 G$ G
  4. int main(){! Z0 D9 h1 S+ A' p/ P
  5.     WSADATA wsd;" K5 Z4 O. }7 J
  6.     SOCKET sockServer;- M1 m( h+ [0 `' E1 z3 i( F
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号2 z" S, M6 {; Y8 V5 l6 T' k/ K
  8.     SOCKET sockClient;
    5 C; x. J/ d8 K5 L3 X
  9.     SOCKADDR_IN clientaddr;& ?7 F7 s5 Z- p" Z2 ]" z
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口  c" }) n5 @$ P$ L' m- ]
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket% S  n" O5 m& q  ]* y! Q

  12. - J% L6 B1 }( I1 O2 t
  13. 6 W! Z0 _5 I) s" v; ^# c. Z
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    " J$ h( H8 c2 }
  15.         printf("Socket has been created :%d", sockServer);
    " u+ b' Q3 f0 r2 l  C
  16.     }8 P/ m+ y0 }( F+ [7 ~
  17.     else{- z( V7 O7 m/ F2 v1 k6 Y* Q( |
  18.         printf("Socket create failed.");, ^$ P" b' }8 s* Q, v0 X
  19.         exit(0);4 U" x1 d! u+ P" \/ M8 }
  20.     }# j; |7 |! w& R  a4 a
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);( }! T5 v( R4 o( u7 C) N: _1 V
  22.     serveraddr.sin_family = AF_INET;. W3 X  }- e4 b8 o4 R
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    7 Z! h- A1 u; E5 p8 F
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ! x5 B. g3 u' y  }" o
  25.     char recvBuf[100];% I' P7 }  I  \  Z3 ^7 [
  26.     int len = sizeof(SOCKADDR);7 A) V2 e9 O: D7 [( O
  27.     listen(sockServer, 5);//5为等待连接数
    5 _& q8 x! r3 f0 V
  28.     while (1){- g7 F9 A0 W; {2 ?- l3 ^+ p/ I
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);4 L+ c% W8 ~7 g; i* Q( o
  30.         //接收客户端数据6 r9 P8 [* e: Q8 r
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);  E$ c* i7 G4 b, }6 H
  32.         printf("to me:%s\n",recvBuf);
    6 P8 ?9 P& O, D4 O/ o
  33.         memset(recvBuf, 0, 100);" a- W. ^2 b) ~7 f
  34.     }
    7 V+ I" h/ n& Y0 u& Q2 N* d
  35.     closesocket(sockClient);8 a9 p+ i% ^" H% z4 ?; ~
  36.     system("pause");- X" T- ^5 O0 \% _, O* b. q, I
  37.     return 0;
    & U0 j$ J1 n; N# a" A) t6 `* [
  38. }
复制代码
客户端代码:
' X, o' X, a% c8 g2 M/ X
  1. #include<winsock2.h>
    3 ]8 `' X" L* D0 u! _) I- f9 D- @
  2. #include<stdio.h>
    / Y5 g- S5 a9 H/ ]4 Y
  3. #pragma comment(lib, "ws2_32.lib")
    - _, B# ~  ?: A  u# C& a, H
  4. void main()+ t9 X- d$ m. z7 l$ e
  5. {) h, W* @, m! N
  6.     WSADATA wsaData;
    & d8 K( Y) y2 x9 `5 l/ Z; @
  7.     SOCKET sockClient;//客户端Socket1 u) ~$ h  ^2 Z; K6 ?
  8.     SOCKADDR_IN addrServer;//服务端地址
    ! t- m+ b- H$ L. U2 r, z  C; n, V
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);: H5 M4 s; k6 e9 p* w3 m
  10.     char message[20] = "HelloSocket!";" \5 w7 V2 G# w' l
  11.     //定义要连接的服务端地址$ _. N7 D5 t+ ?
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    - n0 N$ H5 o1 K; X
  13.     addrServer.sin_family = AF_INET;
    ! K9 m4 a2 y/ u& F
  14.     addrServer.sin_port = htons(6000);//连接端口60001 Y  N- A( C$ t% {8 z
  15.     //新建客户端socket& K* _5 t, O8 ~2 h
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    * F/ m, [( `2 V' F) S
  17.     int s = 0;
    $ i" X+ c; }+ L0 M2 [+ W- T9 z/ M! v
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));+ ]! Y. e  \/ v0 G9 R% L

  19. ( D) ~3 @5 _& X
  20.     while (1){
    ) C+ t$ s+ w. P; D- i4 N, v3 y
  21.         //发送数据
    & w/ i: c9 j- |% ^+ W1 l+ \. S* ]
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    4 I$ A; `# i/ v' F+ J4 e* m: n
  23.         printf("to server:");2 s, ^$ @  t' {( ~1 I4 T
  24.         scanf("%s", message);
    ; F2 N$ r: s" c5 f3 R
  25. # f* h' h: L& k2 h9 ^- \4 ?
  26.     }
    ' y# F7 B3 a: P$ A7 a0 c& ?5 [2 D  _
  27.     //关闭socket
    . P. `5 c5 m  ]$ B; b2 J$ v2 ~
  28.     closesocket(sockClient);5 o# H( _- h/ @! O6 N5 c9 E
  29.     WSACleanup();1 s& `& d; D* O
  30. }
复制代码
求懂的高手来解答一下。. N* x5 D! s/ p' t$ D: t) g! w2 j
谢谢了!
- E& L7 x& f& Q4 U
3 b% r# Y0 N% n/ H: H5 ~( D
' b. g; v% E/ G: G# i, M
( K/ p% I! ]2 S8 o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为0 W1 Q. H7 P: ~: N" [" K
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 02:52 , Processed in 0.136649 second(s), 18 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!