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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
" i5 [% U1 w9 B4 B/ S6 d我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
% a' r. J7 ?; v$ X1 XTalk is cheak , show me the code.
% M! ]9 {+ j" m服务端代码:
4 R+ C+ k# S4 k
  1. #include<stdlib.h>
    ! T# v0 `2 q0 t( H7 Q
  2. #include<WinSock2.h>
    % r  `% t. ], y3 x1 H) t3 ^) a
  3. #pragma comment(lib,"ws2_32.lib"): K& b6 W! q. n, o
  4. int main(){+ Z# L+ o2 l  M$ p5 B1 ?
  5.     WSADATA wsd;1 p4 @. {% R  ^1 V( ~+ ~
  6.     SOCKET sockServer;
    3 q/ u( F# y' M1 }6 o
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    : N" S+ t2 L/ @% ?
  8.     SOCKET sockClient;3 l! ^( ~) m  A
  9.     SOCKADDR_IN clientaddr;. e& Y! N  U+ n. Z
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口$ z7 W: F/ h0 _4 i9 P! s" s" G5 z
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket$ O5 L' b0 l7 N

  12.   q. l" }/ b2 R( \4 b8 ]

  13. 0 @" g* m5 L+ j% W1 C" q* O
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){* G6 h& \( }* X
  15.         printf("Socket has been created :%d", sockServer);
    % A3 Q2 `* z" r5 N3 o
  16.     }3 O# I% I' d9 ]
  17.     else{
    2 ^8 T; ]$ A. q7 B' U  e0 f  b3 m/ G4 Z
  18.         printf("Socket create failed.");; z/ j9 V/ g0 J% @
  19.         exit(0);. n" y0 ~' F2 Y6 B4 B: V, I
  20.     }
    1 p9 i' u5 \9 g' G! ]( T
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    . H1 \  Z+ T8 H7 F& l/ n
  22.     serveraddr.sin_family = AF_INET;* X' v9 E' y2 a2 c7 Y
  23.     serveraddr.sin_port = htons(6000);//绑定端口60001 @. a& A6 x) n( K! l4 o
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));! M9 y1 Q5 ]; a8 F% c: D/ _
  25.     char recvBuf[100];1 }! y, ]* B  i; O& X1 z
  26.     int len = sizeof(SOCKADDR);
    , B; x) M+ M" P) ?4 `) ^
  27.     listen(sockServer, 5);//5为等待连接数& k: m6 G8 V( F) T! g9 G7 [4 m% p
  28.     while (1){7 P5 T; \/ _) _2 L) l- ^
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    0 A4 r- D/ K( J( {$ i
  30.         //接收客户端数据+ G- d) v5 B  R3 v  F# x
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    + d  ]( W: A) z6 |
  32.         printf("to me:%s\n",recvBuf);1 Z" w* @' V2 D, Y* L! Q5 A
  33.         memset(recvBuf, 0, 100);
    6 Y6 P( }: ~( i4 r2 E0 o7 l
  34.     }: I1 L' r# k' i* v
  35.     closesocket(sockClient);
    : {7 G- p' F: A2 A" n; z
  36.     system("pause");
    ) ^1 j2 Z: {. G" Z$ ^6 w
  37.     return 0;
    * y! ^7 K( F6 i0 @6 w6 X
  38. }
复制代码
客户端代码:+ ^7 P4 V+ F- T- e
  1. #include<winsock2.h>
    + A! x4 D. _2 h5 a
  2. #include<stdio.h>
    6 K' o& V0 [3 i  e+ n4 s, ^
  3. #pragma comment(lib, "ws2_32.lib")
    $ O, Q$ V6 Z5 w# Z3 o
  4. void main()/ e' e& M4 l+ y% |4 N
  5. {
    ) Z' M& `) ^$ Q3 h4 b
  6.     WSADATA wsaData;$ r5 z, |  |( \
  7.     SOCKET sockClient;//客户端Socket* I/ O" {0 i* X$ N0 w5 C) U
  8.     SOCKADDR_IN addrServer;//服务端地址
    $ x, O; V4 X% g& ?, }' |% J. `
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);; {: u  Z$ T: I7 |# A
  10.     char message[20] = "HelloSocket!";
    & G7 {$ Q# R/ x8 T/ P
  11.     //定义要连接的服务端地址$ E: B, f7 M$ _( P$ D
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    9 C* l3 I% f7 N! `  h
  13.     addrServer.sin_family = AF_INET;  L1 ]& |& B4 v/ T* [' F
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    " L2 M# T' Y+ p8 P' O0 E
  15.     //新建客户端socket# V. h8 }2 _& }$ G, R. g) {) c
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    % t- a: k* G0 @7 B. H0 r
  17.     int s = 0;) B3 q7 o& B- J- M* P
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));6 B7 G; d: [$ _. |  X9 b
  19. 7 n& w- X: _# m# {6 t/ V3 L% a' ^
  20.     while (1){
    + v5 R  k/ A9 k, @' I) k+ s: ~! O
  21.         //发送数据
    6 o/ [2 H; n5 E: e% W8 J
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);' H  T7 q# H# F' A
  23.         printf("to server:");4 ~! q4 a/ @7 f
  24.         scanf("%s", message);
    $ u2 Y9 u- I$ v4 v
  25. 5 f  p( N& G$ _( n7 z
  26.     }
    : r( X- |% \$ s8 N- O
  27.     //关闭socket
    * Z& F. b! V7 Z- x9 V, T! y
  28.     closesocket(sockClient);
    : n+ R7 G! U1 w- s2 i$ g  o
  29.     WSACleanup();2 I0 K7 U! I" ^- f! \# N5 Q/ }
  30. }
复制代码
求懂的高手来解答一下。
4 T! e0 h$ u  @谢谢了!) s+ L7 V7 {! T  R: Y/ V1 {
2 u$ V# ^: Z$ [2 X7 _1 a
8 m7 f# a2 K0 c9 ~7 X6 _
; u4 d2 x: R% R2 \
分享到:  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 s; M3 K6 K/ Yrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-6-4 09:31 , Processed in 0.058294 second(s), 21 queries .

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