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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。
5 \8 I1 T; t& o+ d0 b+ V我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。5 h- ]9 F5 G) x) O
Talk is cheak , show me the code.. Y4 J* w' T: ^- ^) Q
服务端代码:
9 [/ T  v# m) z0 e! Y) d
  1. #include<stdlib.h>9 U$ W$ c# y' A4 W! ~- m
  2. #include<WinSock2.h>
    2 Q: R  ~% G  n
  3. #pragma comment(lib,"ws2_32.lib")$ Y9 R4 P$ a4 _1 X% s7 x3 `
  4. int main(){
    0 n8 N2 P4 b8 @' j! @% D4 X" {' {
  5.     WSADATA wsd;
    3 d! h% i6 P6 o7 J" U
  6.     SOCKET sockServer;7 ~( K! m7 a* H/ o
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号+ K; z4 C, \& o6 N* L6 z7 P& L3 C
  8.     SOCKET sockClient;# E; z# f% c# ?5 ^8 v, C
  9.     SOCKADDR_IN clientaddr;
    $ _% M' ^4 X( A9 L9 @3 |
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    2 Z/ y9 w! H  [. [7 K
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    6 D: h  h0 F, ?, K! e4 R9 v) ]
  12. ; m- r1 Q3 @6 l+ _5 H+ c
  13. + _( C* Q& G$ ^$ O  B
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){4 O9 B, {, Z  A4 }  ~
  15.         printf("Socket has been created :%d", sockServer);
    1 v, C* f- x8 w& D$ j* E& y2 |3 g
  16.     }% q5 u" n5 ]+ \9 _( Y
  17.     else{$ l  h8 C9 F2 u" s
  18.         printf("Socket create failed.");% a2 h# j- o( e" o) l
  19.         exit(0);
      E! K* c2 S2 a
  20.     }
    / A- e% N# P2 @% s( ]
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    7 h5 T" Z9 S( N1 ^" z( I3 M, Z$ l7 d
  22.     serveraddr.sin_family = AF_INET;; \/ r8 _/ e) u+ H4 x: ^4 m5 I9 j( ?' Y
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    * i" t- {: ~+ T, G( H$ I! ]; ]" h3 i
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));9 I6 L. Y% P. ~# L( |3 }7 k1 \3 t& H
  25.     char recvBuf[100];% f2 w; {. `3 B4 M$ l
  26.     int len = sizeof(SOCKADDR);/ |  k; _' r) h5 M" I: n0 B
  27.     listen(sockServer, 5);//5为等待连接数. x2 `/ o6 z1 F/ G# o! h% r0 [
  28.     while (1){
    4 [& V1 c( a8 N" x
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    * |) e! K' N9 X
  30.         //接收客户端数据
    & U. b, F% {8 l
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    + j! b5 b; n4 {2 s
  32.         printf("to me:%s\n",recvBuf);
    ' k9 [5 {! M# k. X1 ?5 s; O5 H
  33.         memset(recvBuf, 0, 100);& o! i" Z! N9 S0 x# C$ E
  34.     }
    - ]& e# c* `: d0 q+ O$ W6 C
  35.     closesocket(sockClient);
    ( l0 h" I1 U5 G2 s& I7 f
  36.     system("pause");, Z% U, n% C+ v' g) a! v9 C" P# `5 \
  37.     return 0;
    % F0 F3 ?5 A  k5 Z  D. E, Z1 W) h
  38. }
复制代码
客户端代码:# l3 L. x* `' D4 e1 {5 A/ z
  1. #include<winsock2.h>' d8 \3 s& y' L  S
  2. #include<stdio.h>
    " ^5 x' w" X- L: [9 @& G% Z
  3. #pragma comment(lib, "ws2_32.lib")
    - y( J& q/ }0 l2 G: s, I6 ~0 j
  4. void main()
    + ^2 T4 z! z+ w" H. P; A" _0 }
  5. {" ]: D: ~2 C2 ~
  6.     WSADATA wsaData;+ }9 ]( |8 r7 B7 N4 t" N. D, y
  7.     SOCKET sockClient;//客户端Socket
    1 z, q, |& d( s9 V" M8 v
  8.     SOCKADDR_IN addrServer;//服务端地址
    5 @! _: B5 [; G4 {- I; V3 U
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    & ], f# o  F( Y- v; q: W( s- J
  10.     char message[20] = "HelloSocket!";. {* {: Z  ?& |+ S
  11.     //定义要连接的服务端地址
    , D# h) X; f, C. e; E
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    , D: p+ T. I: ^/ F% Y
  13.     addrServer.sin_family = AF_INET;8 Y9 N, a, G6 a
  14.     addrServer.sin_port = htons(6000);//连接端口60000 |! J$ T3 W( K$ {, D- h
  15.     //新建客户端socket+ K' D4 t0 x9 P; {7 U5 T2 R
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    4 \0 x- P) ~3 m
  17.     int s = 0;
    ' I' y5 k( N% ^' Y$ P) m
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    . X* w. t" {# X$ b3 N

  19. . s6 r0 o2 r3 F4 [7 b  v3 L
  20.     while (1){
    ' v1 t% i0 C+ S  w; V5 a" g/ q
  21.         //发送数据
    * t. g0 C" o) W: [! Z1 q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    - i- T; ~' F, v- \
  23.         printf("to server:");' x4 [" J" \: ~
  24.         scanf("%s", message);$ c' e  b  C: b$ z0 ?7 z3 H. h- H
  25. ; H# r2 f  u/ H! j  h
  26.     }, w# T) A" s; Y2 S7 ]1 b2 h
  27.     //关闭socket
    # q( @' g  W$ d/ u) I0 N
  28.     closesocket(sockClient);
    , z% U  S0 n, w; e0 E
  29.     WSACleanup();3 F! r. n0 ~6 I/ f; ^$ }& n
  30. }
复制代码
求懂的高手来解答一下。
9 i) b  W2 b4 k, E谢谢了!0 J# [+ k: d  \" [) j7 Z

8 D* I( K- O" W' O$ a% r& G+ }/ ~8 l3 p- j, `: N4 l" {& w
, Z$ X+ Y, l/ D  O* p3 r2 _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
8 f0 ~* W/ W3 }/ _recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-21 03:11 , Processed in 0.049526 second(s), 19 queries .

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