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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
8 D% C* ^. j0 s4 i6 G, \* Z我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。/ V# K- ]7 n& ]  S0 f
Talk is cheak , show me the code.
. V2 ]; y! p- a/ [服务端代码:
" y4 T. @" s4 S! s9 H
  1. #include<stdlib.h>
    2 v) f1 A# L- F' V) O  g
  2. #include<WinSock2.h>
    + N5 N, H8 W1 b/ o. P
  3. #pragma comment(lib,"ws2_32.lib")
    - f3 e4 P1 V9 A7 u% g3 Z" x% @
  4. int main(){
      f3 }: L. o2 S$ A1 F5 e: r
  5.     WSADATA wsd;
      }; S; F1 y4 v- }" i
  6.     SOCKET sockServer;
    ! t! r: U3 y* u7 E
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号3 A- \. C: X5 L& ^8 T) C
  8.     SOCKET sockClient;  _" l- j" z* Y6 m$ E# S1 t
  9.     SOCKADDR_IN clientaddr;
    ; |7 l( Q# h' c* W/ z
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    : G! u) [# V) m9 w
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    9 L  h+ |0 @7 C0 _+ ]
  12. 0 v/ r( ?4 X) }" Q6 V' U

  13. 2 ]8 Z8 {* _1 @8 q' e
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){. g9 l4 C! a, S3 E8 v* j
  15.         printf("Socket has been created :%d", sockServer);
      }  U  E9 S  r( m5 Q# M
  16.     }( a; n9 W- D' M: O
  17.     else{7 C$ l8 b& G2 b% B  t8 y
  18.         printf("Socket create failed.");$ t  B9 A- ]* Q  b* a
  19.         exit(0);* T  a* f- f2 q8 g
  20.     }+ B9 q6 e' w1 U8 L; `: @. S& `
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);0 m4 ^6 o1 i7 D
  22.     serveraddr.sin_family = AF_INET;
    3 c. C/ ?3 l" p3 A- w0 C
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000. Y4 ?, X2 x6 j! a; C  E/ A
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));. u/ Z) ]9 Y- L" f: I
  25.     char recvBuf[100];' o8 e: k5 D% i2 N1 h1 o: `) Z
  26.     int len = sizeof(SOCKADDR);
    ) U3 g+ k+ m# P1 S7 q
  27.     listen(sockServer, 5);//5为等待连接数
    , W3 T* [: e! W( X, D: \5 F
  28.     while (1){" F. G3 P  K) y. q- K. K
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ' M" N$ M0 A8 |+ L2 x0 U
  30.         //接收客户端数据
    2 B5 W+ Q, m8 K" f4 }3 ?& f) u
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);- ?; V' S1 O5 Y3 }, H3 Q/ p
  32.         printf("to me:%s\n",recvBuf);
    ) d# @6 b5 v" Y5 m
  33.         memset(recvBuf, 0, 100);! j1 H! V8 ~1 q- E; ~9 ~
  34.     }# u- H7 r* c" g& Z8 G5 b
  35.     closesocket(sockClient);
    ' n; A$ R% G( q& f
  36.     system("pause");
    ! U9 _" v3 k0 F$ q, G: T/ }2 t5 H
  37.     return 0;4 ?, W6 w' i, E7 s( h
  38. }
复制代码
客户端代码:3 p+ [& v! r# V2 M/ z
  1. #include<winsock2.h>: F" q/ _' G2 v$ T
  2. #include<stdio.h>
    " l$ N' S* e5 E; t
  3. #pragma comment(lib, "ws2_32.lib")
    - D. C  X6 m" T% W/ i
  4. void main()
    * d2 B" O+ _1 e( \( Z% L
  5. {% H4 y: Z+ j: H$ O: H; L
  6.     WSADATA wsaData;" w$ b* M: g! i  V1 R# d
  7.     SOCKET sockClient;//客户端Socket( p5 E" B0 ~) E$ z3 c) }+ T. F
  8.     SOCKADDR_IN addrServer;//服务端地址
    : U# ]& j; T8 Q* ?, f) F! `
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);$ ^8 I; U  E# l* R; ]/ q9 R
  10.     char message[20] = "HelloSocket!";
      X6 ?" R* [8 Z: e2 K8 \. {) m
  11.     //定义要连接的服务端地址
    % [7 c! ]" @5 X  \8 l
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)5 b: U5 w& z4 d( Y
  13.     addrServer.sin_family = AF_INET;
    0 v0 W7 e3 h2 z2 J- x# h
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    . n- G' |( o" n; f( k+ K) i
  15.     //新建客户端socket
    0 y3 g+ X2 i- P# R% ]1 ~
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    # J" U# b+ Z& P9 j- i
  17.     int s = 0;0 @, U* V! m  g/ n$ ~
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ; R, O: G) t  H8 w5 Q

  19. ; p3 C/ W; c& j
  20.     while (1){  N' V' S  I! ~! O5 x
  21.         //发送数据6 [& g2 V( C/ ^% a- ~
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);0 l( T4 g4 ]4 {" K
  23.         printf("to server:");
    + k8 D; q7 h& @" w2 a/ W* V: t
  24.         scanf("%s", message);, t2 U7 @" a0 F' z" X3 R

  25. : H1 w- L) }# d/ @! `
  26.     }- o2 Z7 {* J$ D
  27.     //关闭socket
      ?4 D! g2 `/ V; X* H, ~
  28.     closesocket(sockClient);
    " o8 R2 g. P9 ~1 u8 B3 `1 r0 ]
  29.     WSACleanup();
    / c. R1 r8 g  ?, A- [; [
  30. }
复制代码
求懂的高手来解答一下。
. v2 W, _2 s& I& A' w* X& a谢谢了!
/ h# I& ~2 E9 ]' _
# K( |3 X. {7 D1 Q* g+ b9 m
7 Y8 L0 J4 n% Z

6 l; V9 n2 {- h2 D. T& R! X% _% 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); 这句改为/ v" P6 @7 e3 _' r7 p( L% o6 q0 m  @
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-6-19 23:59 , Processed in 0.061623 second(s), 18 queries .

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