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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。8 C9 V, Y) }1 _* [
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。4 b$ F( c: u" C: f8 j0 _
Talk is cheak , show me the code.
% I7 O, g$ q5 O1 O3 E2 }$ F服务端代码:
3 A  Y  w0 F0 E0 u7 f: I$ q
  1. #include<stdlib.h>
    ) h2 [" x& q! m8 v+ ^% D
  2. #include<WinSock2.h>0 O! o7 H) E! f. h( T0 \3 a
  3. #pragma comment(lib,"ws2_32.lib")5 V& @( t, D5 Q# x/ q  \
  4. int main(){
    9 R- C" R8 C: F* M$ V7 D
  5.     WSADATA wsd;9 L# u; Y" ~+ \
  6.     SOCKET sockServer;" k& u& {  e- f0 D! o7 H$ q
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号  _0 S9 }7 m# l( M/ T0 w/ y0 h
  8.     SOCKET sockClient;/ a. c  ^  w9 r
  9.     SOCKADDR_IN clientaddr;7 p; `" I2 d+ F/ e
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口, J7 G4 x( c  z1 r
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket. W$ [, L9 p1 I/ |! u1 `5 q' S7 V
  12. . @: B7 n" M% Z" Q: ^, q+ n2 t
  13. . f1 F0 e% N0 ~8 Q! P# m. J
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){( t; M5 {5 ^* V9 n5 |
  15.         printf("Socket has been created :%d", sockServer);6 W* J( Q0 q0 e9 D$ _
  16.     }
    0 q, n9 S! a' y  y
  17.     else{
    ( ?0 Z- D2 E4 |" l2 B" a) V
  18.         printf("Socket create failed.");
    + P( W7 d6 g. o- {1 ^
  19.         exit(0);& K! p- v' v: d# @6 O5 e) y, E
  20.     }
    8 w) R/ ^1 r+ Y
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);* t4 W/ }  b3 z' L! r/ O
  22.     serveraddr.sin_family = AF_INET;
    / F. j" s1 Q( B0 V' Z  I
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    ) z, y7 E, X/ @0 a  N
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));' L9 K' Y5 \4 a7 i8 J$ H" I7 _4 _
  25.     char recvBuf[100];
    ) h% ?1 G2 ~' N( e" J
  26.     int len = sizeof(SOCKADDR);
    , C% k; u; F9 p+ x* m) `6 l
  27.     listen(sockServer, 5);//5为等待连接数
    # R" D( z. x( N' A$ W
  28.     while (1){" M8 h& s6 E8 ^" ~+ ?5 i5 j" U& y
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    9 y2 \5 k  ]4 U2 g4 t$ r% H
  30.         //接收客户端数据+ a# B- b6 P, K
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    2 X. N$ d! u; D  D9 s; P) G/ {# u
  32.         printf("to me:%s\n",recvBuf);
    0 [' [9 C/ y5 i' D: h$ w+ |0 f
  33.         memset(recvBuf, 0, 100);+ u* T) u4 e% [: m3 K) o5 z8 @
  34.     }7 }" L: I, n0 S6 @) O7 z
  35.     closesocket(sockClient);. p6 \1 g. b. X1 Q9 |
  36.     system("pause");) v/ d! T/ K4 ~. d" ~
  37.     return 0;, R1 h) R7 P/ T' u6 W6 s( x
  38. }
复制代码
客户端代码:
0 X9 u0 B0 {9 f; o# P3 u0 Q' w* {
  1. #include<winsock2.h>
    # }, ^) x4 b% L7 m
  2. #include<stdio.h>
    - z& X/ ~: M* b# _6 L% O; ^
  3. #pragma comment(lib, "ws2_32.lib")7 j- B* o; g7 ]% I7 g7 f
  4. void main()
    6 Q* x3 Z. f; o& w4 O" h
  5. {- ]. p6 f6 E8 n0 u4 E
  6.     WSADATA wsaData;9 \  p3 c3 c5 @8 c) ~
  7.     SOCKET sockClient;//客户端Socket6 y; S/ W" r( |( f
  8.     SOCKADDR_IN addrServer;//服务端地址
    7 l. k( D7 ?# ~3 F- V
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);$ T1 X1 k# X7 F, q9 Y: {
  10.     char message[20] = "HelloSocket!";7 G/ |* U# Y+ @1 g
  11.     //定义要连接的服务端地址9 U2 r' S: f0 k; L1 r, K) I
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)/ I- N. T1 l3 t7 k: `+ U7 F
  13.     addrServer.sin_family = AF_INET;
    . O: L3 X. |' O& M# w$ `% D
  14.     addrServer.sin_port = htons(6000);//连接端口6000  s+ i% q8 r& K3 {& }
  15.     //新建客户端socket0 v/ X9 u% Q* p& W8 C& {
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    2 G" E. H7 c8 s6 G
  17.     int s = 0;
    ( q- ^+ Z. ?( a% ]
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ) }0 E# [4 }; `* ^- R
  19. - C5 r/ n! z4 {! ~; Y, k
  20.     while (1){. j7 E6 w) r+ R: r" a/ V* X. R6 V
  21.         //发送数据
    $ n) k+ B' v& I" f7 z
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);# a7 b" R9 U8 x6 V/ E
  23.         printf("to server:");0 H' c- Y+ y: i8 Y1 j8 h
  24.         scanf("%s", message);
    % Z/ J4 [! g" O6 N

  25. & K# ]4 Z0 }' _6 S1 X* a- S: a
  26.     }( a" M6 M. u0 @
  27.     //关闭socket- @- v( @" G; d  m, ?2 d3 k
  28.     closesocket(sockClient);
    % i: U2 x2 c" Q' I
  29.     WSACleanup();6 s+ k) c' }' t7 ]2 u8 ?' ]
  30. }
复制代码
求懂的高手来解答一下。. }, G1 |% I9 V+ `9 h$ \9 i0 b
谢谢了!2 }1 ]8 a* m8 ?5 y
4 m# J: Y* g* {, T
- S6 A. e3 f, R; D
5 e1 f9 K- H: y+ z& Y" z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为, Z. _& I  @/ g% `& k
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-21 00:53 , Processed in 0.053103 second(s), 18 queries .

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