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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。% @5 c) r* V6 ?: c8 b
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
9 W& g# F0 i7 i0 w2 G4 x- gTalk is cheak , show me the code.) X4 }3 g. P( h* b' j: x/ L* }
服务端代码:- J7 D% m6 P8 }1 ?1 f& p6 _- e
  1. #include<stdlib.h>. \$ B, O" p$ `0 s/ ]
  2. #include<WinSock2.h>
    : A( j  _; M9 P% B4 X
  3. #pragma comment(lib,"ws2_32.lib")( w. `; l: O' Z: z
  4. int main(){' z+ M3 N  Z- G) t* [* i! E* u
  5.     WSADATA wsd;
    ! J1 A; t# F8 Z' t$ T
  6.     SOCKET sockServer;
    0 V$ |) X  M- d7 f5 v
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    8 w( n0 {7 k3 U1 o2 K3 b8 @
  8.     SOCKET sockClient;
    ! r: |3 G4 L2 _* N1 n- U; \
  9.     SOCKADDR_IN clientaddr;
    . |) p# Y" `# i; b' M0 t6 S) x- R
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ) {2 N! E% c, o- o
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    & h3 _4 M: G1 e3 x+ ?+ V& X  n& J

  12. ' z# [5 r! `0 `$ ~; ~
  13. 4 y! u; c- v8 e$ ~% c) s( G8 w! n
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    - V2 K& u# ?& {+ g9 q
  15.         printf("Socket has been created :%d", sockServer);
    - O  R! |( G% s7 E. _1 e
  16.     }7 ~! P6 V/ [& F6 \" o
  17.     else{
    ' `; Y, F! V1 i) o: Z( ?
  18.         printf("Socket create failed.");
    ' J! X) W3 y! q- c0 r: U, |$ w
  19.         exit(0);
    # ^! D$ D' o7 L$ E* }" d
  20.     }& p% k0 O- h: p7 o0 ~! O+ W
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    & Q& Z( S2 ]; s/ M4 X& j4 }; |9 i7 j
  22.     serveraddr.sin_family = AF_INET;
    1 l" P" c: G( }9 {( \
  23.     serveraddr.sin_port = htons(6000);//绑定端口60009 P7 d: q& n9 X( i
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));9 y8 ]8 M9 D  J6 @; c% G
  25.     char recvBuf[100];
    4 e2 Y+ Q5 S% B+ S$ Q& V
  26.     int len = sizeof(SOCKADDR);# L1 f# ?8 }; j6 [0 W% X5 k1 b
  27.     listen(sockServer, 5);//5为等待连接数
    & t5 H6 m2 z) v. L0 B/ k! f
  28.     while (1){+ l, o0 o; S( P9 I) ?! H
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    : }( }, |8 F# n; t9 C  E. y4 G
  30.         //接收客户端数据2 g% B) o" l0 ~: |# [
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    2 X# s; ?: H' S
  32.         printf("to me:%s\n",recvBuf);+ M! K" t9 ?5 x" i2 T
  33.         memset(recvBuf, 0, 100);8 ?( e7 q7 d& f0 L' W! @& \2 t
  34.     }+ \% W3 ?8 Y4 C2 Q
  35.     closesocket(sockClient);) {6 h  k: E1 a* ~( Z0 ]. x
  36.     system("pause");
    : c4 w. b1 V( i  C, [6 R
  37.     return 0;
    2 r( j. M4 W+ u7 m0 V" M" J
  38. }
复制代码
客户端代码:
9 W- s8 C5 M4 C4 s2 g
  1. #include<winsock2.h>
    2 U! L. B* F6 r" N8 b3 A
  2. #include<stdio.h>
    $ J2 H7 M- y) D; L5 Q
  3. #pragma comment(lib, "ws2_32.lib")" ~, c! t5 \5 T# a5 H  T
  4. void main()6 ?! v! m5 y, f& I4 J
  5. {3 ^8 [/ H  F4 `2 [. f
  6.     WSADATA wsaData;+ j( g0 j8 c8 \# E( b
  7.     SOCKET sockClient;//客户端Socket* _$ Y: a8 R2 K! w
  8.     SOCKADDR_IN addrServer;//服务端地址9 T- j& K& n. s- A+ V8 k& ?
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    $ y( b5 r6 ]. f* j( z$ g
  10.     char message[20] = "HelloSocket!";
    & v4 E8 t2 B. k8 n
  11.     //定义要连接的服务端地址
    : I. O& C7 l9 y! u
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    + T0 n, Y% X! L# u7 g: m
  13.     addrServer.sin_family = AF_INET;/ s: E- L$ F0 s* Z: \- k) q
  14.     addrServer.sin_port = htons(6000);//连接端口6000) ]$ K" H/ M6 s$ ?2 j! d0 k
  15.     //新建客户端socket5 F2 `  d1 y9 M0 i6 j
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    * \. M& N0 G+ j0 d. E2 {' \
  17.     int s = 0;; O% p* b+ q3 u0 |
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));8 g; A, E) w1 ~  V

  19. 0 m  m' n' H, M0 R5 E& ]
  20.     while (1){
    " o0 t, V2 F' _2 z6 @/ q- d( Y; Z
  21.         //发送数据
    " N5 S6 F' `* @
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    . G* t9 {; u+ M9 ]" d: T% w7 C
  23.         printf("to server:");( d5 t# n- o* Y# g! I: P: F
  24.         scanf("%s", message);
    6 y8 b% V+ c* Q2 [3 K1 l

  25. 7 Q6 W- {0 l" R7 X3 h
  26.     }2 T2 A2 ]4 F+ V( G
  27.     //关闭socket
    6 j1 |& C- o' {- U
  28.     closesocket(sockClient);
    * j. }9 \( V3 S$ ^+ `* a0 T
  29.     WSACleanup();
    5 h! S4 R- R1 d
  30. }
复制代码
求懂的高手来解答一下。
0 G( p7 P$ |4 I+ ?  U" [谢谢了!
- y2 M4 g3 N1 N6 T" w
' J; {- |6 Z3 R4 ^+ k
( z& W6 v1 q8 a) b
; E. a: n; `( ~9 R" o6 H8 c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为7 H/ I: y  m& K  t
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-12-22 11:00 , Processed in 0.116646 second(s), 19 queries .

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