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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
/ G" g; X; r8 n/ r4 d5 w我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
, K+ p6 z: `: S6 q( kTalk is cheak , show me the code.
3 q* W7 g$ p  L; O7 W0 ~! Z服务端代码:
  \# W! W( c4 A9 P' \
  1. #include<stdlib.h>
    ! t( R; b7 {. C' \
  2. #include<WinSock2.h>
    ( K* Z. C" ]/ W8 V! j
  3. #pragma comment(lib,"ws2_32.lib"). n0 m8 j+ I" Q1 p! r
  4. int main(){
    ( d3 t$ o/ n$ t3 I$ N
  5.     WSADATA wsd;3 y' D/ v% q  E) v
  6.     SOCKET sockServer;
    5 c* ^  Z; ]1 g. x+ Q1 Y- b- C6 c
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    $ X* h. j: F1 f0 T2 w8 v  C" P" Z
  8.     SOCKET sockClient;
    6 q/ o1 M+ l9 s5 m
  9.     SOCKADDR_IN clientaddr;
      C+ W0 b8 R8 ^& J
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口/ S! x) [! F6 D: A
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    . J- {7 y: I7 w0 d0 N

  12. - @: v! x9 K- _4 m& H) l9 K
  13. 8 Q3 B9 Z) \  f6 O
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){2 L/ V. E5 m4 }7 T
  15.         printf("Socket has been created :%d", sockServer);
    9 \, G) m& W% a: `
  16.     }5 O& @' ]8 a7 n; u1 x
  17.     else{
    ; [0 V& a* W' u* U9 d6 @( ~4 F
  18.         printf("Socket create failed.");
    . R2 B' N  G7 ?8 w
  19.         exit(0);7 d% K2 Q- Q, s# G6 S
  20.     }
    ; X# w& S. \2 q2 D3 o# m
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  s; A/ @0 J2 ^0 V5 e! ?
  22.     serveraddr.sin_family = AF_INET;: l+ L3 f2 }1 d9 W$ o
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000. u  f% q/ G$ V. i$ N
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    $ n" r# k1 z* D" V( x
  25.     char recvBuf[100];; h6 ?2 L( w* b2 ~0 S6 ?
  26.     int len = sizeof(SOCKADDR);  J4 o" G3 Y& V+ u+ k0 r$ D0 x
  27.     listen(sockServer, 5);//5为等待连接数2 I8 P0 ^  E" ^$ A
  28.     while (1){5 A, \# \( ~1 |4 P/ y3 t% G
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
      Z2 w5 q, W2 N. w. P
  30.         //接收客户端数据
    ! m% }7 e1 {( B6 ?1 d0 t  ~
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    " y' ^  D, O( D4 E0 W& o
  32.         printf("to me:%s\n",recvBuf);$ N, _4 ^2 v+ V3 S) E
  33.         memset(recvBuf, 0, 100);1 D0 ]5 F* e% Z/ ?2 F
  34.     }
    % f' c; M1 r) b4 R3 F5 a
  35.     closesocket(sockClient);" F) b! @. f0 g. `8 S
  36.     system("pause");4 \. n) o: U% S+ g
  37.     return 0;
    + [5 {" q4 J6 D- f5 {! ]& x
  38. }
复制代码
客户端代码:* F8 b4 ?' l" v9 s5 ?) T
  1. #include<winsock2.h>: R5 V. f- S# C4 m7 |
  2. #include<stdio.h>
    0 v4 v4 D3 {# x" p# K* }
  3. #pragma comment(lib, "ws2_32.lib")
    7 V  \+ R' w, E$ B$ Y& Q2 q
  4. void main()
    . n% E* m4 z) ^" g. s$ R
  5. {
    7 q, P4 x, A6 L# g6 T- V
  6.     WSADATA wsaData;6 S6 U; J+ M. e) {: v: u
  7.     SOCKET sockClient;//客户端Socket$ |! r6 d  A  w, ]7 `: R
  8.     SOCKADDR_IN addrServer;//服务端地址: ~( e+ [, [; i$ e' v' ]+ [7 ^2 K
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);8 y1 z8 y$ \8 p" }- l* ?) q
  10.     char message[20] = "HelloSocket!";* X0 G& D6 m4 y6 r# ^
  11.     //定义要连接的服务端地址
    8 l0 i9 N, |: S8 Q9 q* V  b
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    6 f" k* _) x7 Z4 Z. c# S: G4 X
  13.     addrServer.sin_family = AF_INET;# y! A% l6 G2 d& J) G+ Z, i" X
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    0 F" L3 j$ T" K: Y# R2 h* i
  15.     //新建客户端socket$ m" X+ E) L; j  a* n+ X! Q
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    , \& |- r" ~( m
  17.     int s = 0;1 P2 _" K9 m6 k
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));' ]5 x$ i0 \. o
  19. 6 D6 ~( P6 G/ _/ b' @  Y7 D1 a8 h
  20.     while (1){
    0 H" W1 z! z4 l: Q- x; G! V9 p1 W! h7 b
  21.         //发送数据
    4 w3 r1 S4 _# a7 X9 L
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);- G9 t5 f' h$ Y( V8 w1 p
  23.         printf("to server:");$ K: m" g3 t+ y% }# L  b+ q, O
  24.         scanf("%s", message);
    " P/ X: x, p7 M; f
  25. " \4 h, L/ C9 A2 }
  26.     }1 R$ V, P9 M6 x1 m/ w; y; W
  27.     //关闭socket# Z# Y) h7 I$ K
  28.     closesocket(sockClient);5 y! H+ U& o0 _. ^& z2 K4 d; N
  29.     WSACleanup();
    2 b7 w+ f6 i( l6 e' W; o
  30. }
复制代码
求懂的高手来解答一下。  ]: V; r3 H: }
谢谢了!! J: b1 S& n4 T, T# F6 M

5 _4 u' t8 A+ a4 U. C  y# ^3 t4 b
' S+ S- H4 x( C4 S& F3 l4 v  t% O. [$ m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
1 E+ M0 \% w1 vrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-9-29 08:15 , Processed in 0.114717 second(s), 20 queries .

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