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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

发布者: admin | 发布时间: 2020-5-9 02:32| 查看数: 15939| 评论数: 2|帖子模式

大家好,感谢你的回复。
. @$ P" t) x- i8 H$ p/ S. X# S- E  @3 H我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。7 p& q3 v$ D* Q2 @, t1 i
Talk is cheak , show me the code.* L, C1 v  _, v) q7 w
服务端代码:' I  Y0 y& m7 }) Z" a
  1. #include<stdlib.h>
    1 K" [/ ~4 K  y& ]0 ~& I6 d# J0 A
  2. #include<WinSock2.h>
    ' m" N# [& w6 J4 e
  3. #pragma comment(lib,"ws2_32.lib")
    * _) I3 _, M) ?$ R
  4. int main(){1 _% J* E; d& J" l
  5.     WSADATA wsd;
    - |( c/ @+ D1 H; a4 e
  6.     SOCKET sockServer;
    / K* ~9 N5 U3 C0 u3 I% P
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号, l% e0 X/ f' H
  8.     SOCKET sockClient;
    % p$ ~; O9 m& Q- s
  9.     SOCKADDR_IN clientaddr;9 M% k- T6 H7 s$ q+ ~* K
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口0 d( N# X! M# |' s# k. N
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket+ x2 [; p) u, T2 `( ]: a
  12. 3 B1 R0 @; O0 M  q8 {8 E
  13. 9 l' w9 ~% [, \; B0 c
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){& @( g* z: m) R* p% `  s/ m# f
  15.         printf("Socket has been created :%d", sockServer);
    9 Q$ }" W) E# X7 v: m$ J
  16.     }
    9 s: H/ K2 ]/ Z, E- e
  17.     else{8 W% w4 v- W9 P8 A9 K' f; [
  18.         printf("Socket create failed.");
    6 v7 ~* s  s9 w& A5 i
  19.         exit(0);
    4 t( h- S# ?" m9 u& Z1 e0 v+ a
  20.     }; u- [3 ~. a6 a' n
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    0 E: Q4 Y- P" l
  22.     serveraddr.sin_family = AF_INET;  w* j5 a( k9 ?
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    . |( [! _  i& |4 o
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));& Z5 {3 h/ L' A. c8 j" Z
  25.     char recvBuf[100];, |& u. N9 x0 \* Z
  26.     int len = sizeof(SOCKADDR);7 z; \: v4 T1 @
  27.     listen(sockServer, 5);//5为等待连接数$ p7 }1 Z3 g+ C
  28.     while (1){1 w  I3 [3 t1 ^4 B' u+ D
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);3 r- ?! L. Y! ?5 ?  H
  30.         //接收客户端数据
    * o1 M! h; B% d, d$ k" d) m0 `7 i' Z
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    / l( [! D: ~2 w+ L
  32.         printf("to me:%s\n",recvBuf);
    9 x& p( ?9 J# x3 o( n
  33.         memset(recvBuf, 0, 100);6 }; I1 S9 c- ~1 `8 j( L$ p4 D
  34.     }0 C4 ~' C7 l5 |+ R9 G$ U& ^1 h
  35.     closesocket(sockClient);
    $ S9 l9 S* f( L' \& e2 L
  36.     system("pause");
    5 R+ }2 e# L' j* [/ ~& S0 l
  37.     return 0;
    ) x9 H: P/ Q3 `( x; d4 A$ g
  38. }
复制代码
客户端代码:! e! {3 v) y$ N/ K5 k, z6 {. N4 ]' v
  1. #include<winsock2.h>
    + K; B; v# t1 f5 i
  2. #include<stdio.h>
    0 f/ F% q! b$ e- J! _! D
  3. #pragma comment(lib, "ws2_32.lib")
    8 D0 M) ~! L& a. ~3 S* L3 C
  4. void main()
    . O8 ^9 x9 y8 r2 S6 |2 g+ M; z9 @
  5. {% ?4 b& j2 Q' L4 \% F
  6.     WSADATA wsaData;* y  [# U# P; x  U( V6 j
  7.     SOCKET sockClient;//客户端Socket
    , l: I* o0 o3 d5 X* Q
  8.     SOCKADDR_IN addrServer;//服务端地址% a0 i: i: o2 M( ]- h
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);& W# J$ u% b' G- Y
  10.     char message[20] = "HelloSocket!";5 C+ a2 u; ]3 [
  11.     //定义要连接的服务端地址! H- c( V, z$ ?0 b8 V1 U: l
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)# V: V, E9 S" W" t2 f
  13.     addrServer.sin_family = AF_INET;/ M+ c0 B" _& ~  ^6 a
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    6 k$ I0 S6 T5 p! d7 s
  15.     //新建客户端socket
      i$ Y. c) p" b2 _; U4 |1 K
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);# P: |1 q, x. l( e
  17.     int s = 0;
    8 H4 F+ ]3 T+ u" V  g: J
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    * Q% M6 j8 e9 H4 [7 r

  19. # c5 S! m) y  M4 Q& V
  20.     while (1){
    . p) n7 B- c3 V
  21.         //发送数据
    . c; a7 x- A* Y
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ' t& F) V7 x# c; j
  23.         printf("to server:");2 a; J2 E' g  ?! w$ o; F
  24.         scanf("%s", message);6 \  J, ]! V, J7 Y( R4 Z2 v

  25. / k' G" K1 Z4 r7 T1 _
  26.     }
    8 ~% n7 Q& X* H8 a% Q
  27.     //关闭socket
    ! Y( e6 \. k1 |9 l' t
  28.     closesocket(sockClient);
    * ?& X/ Z* T5 U+ m# \4 g+ F  F
  29.     WSACleanup();
    . A# `% Q$ c5 {7 k) B  B0 ]) R0 @
  30. }
复制代码
求懂的高手来解答一下。- @6 p- b1 J6 i& t' c
谢谢了!, _% D$ [3 e/ ?

, s: |) z" n3 x# B5 {( v1 ~* {9 E- |
2 c: C1 a# O# C6 g) W0 n3 m8 \6 _- d: H

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
2 ?: Z: v" V' X, w7 Trecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-3-16 13:48 , Processed in 0.052181 second(s), 18 queries .

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