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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3423|回复: 2

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

[复制链接]
发表于 2020-5-9 02:32:26 | 显示全部楼层 |阅读模式
大家好,感谢你的回复。4 {1 K$ \3 x$ f  m. f
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。- k* Z* V6 d, V: d0 Z8 P& M1 w. ]
Talk is cheak , show me the code.
. N+ I7 A! _3 a7 H服务端代码:4 i7 A7 k- L. g' {3 c
  1. #include<stdlib.h>
    - e( ~2 ]! J& X7 y) j- H, \
  2. #include<WinSock2.h>
    + d. @7 ~$ Q6 }& Q0 M/ Z
  3. #pragma comment(lib,"ws2_32.lib")
    ! u7 U, v; V4 ~; [
  4. int main(){) Z* Q% @4 q- M) R
  5.     WSADATA wsd;( f( k* X; D) E: U# w1 }# H1 a# O
  6.     SOCKET sockServer;: U  d! ~% @1 K! G9 Z; X
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号0 a) x1 {8 R$ R8 S4 m/ W$ k
  8.     SOCKET sockClient;( _, m3 W$ o' d5 F3 j1 m  N& ^' N
  9.     SOCKADDR_IN clientaddr;+ @" X4 ]; B. y5 i8 f2 n/ v4 c( q
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    6 P5 u8 C* m* I6 D; k# }
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ; |2 c) d' O" [' l# |4 d
  12. & V: ^& f7 |+ G4 U, P+ E& Y
  13. 9 q2 V5 F( k7 I! W
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    + n, d& f# u, `2 @
  15.         printf("Socket has been created :%d", sockServer);1 B3 C& }4 E# e8 P
  16.     }4 r, a: @9 f7 p1 n
  17.     else{+ R, d8 J; `- {8 U* X
  18.         printf("Socket create failed.");
    ; L8 i* h; @) H* O# e6 g9 P+ v
  19.         exit(0);4 B, p7 H0 G5 l( g7 X0 q
  20.     }9 V  N& U. p7 t9 }7 u
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ( p4 ]  C; l2 {/ G& h
  22.     serveraddr.sin_family = AF_INET;
      o6 N( x: \9 l. l& `
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000/ w* \4 W" a1 K$ ~% t" D
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));( l& A% e9 o) @& X
  25.     char recvBuf[100];1 j* G1 J% s" G2 ?$ a* C* q
  26.     int len = sizeof(SOCKADDR);
    ' ~/ k# W4 f) B  z: d, `* D  r
  27.     listen(sockServer, 5);//5为等待连接数7 g  r& ]9 @* R0 ]6 m4 x! B) d
  28.     while (1){
    & O1 I5 K) _# K( o. z
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    3 P! b5 f7 m" y4 _
  30.         //接收客户端数据3 e( i; m0 R, C9 U8 {5 p1 Z
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);' Z) @& M9 `) R& c) o$ m% V
  32.         printf("to me:%s\n",recvBuf);
    ' `; ~+ E/ U7 U
  33.         memset(recvBuf, 0, 100);2 D- C' I* t1 @  j* j) W" h
  34.     }
    ; S7 A, G9 a$ h0 ?0 Q
  35.     closesocket(sockClient);
    6 {: I+ k9 ]- b' m- d% Y/ j7 v
  36.     system("pause");( M5 c" m  x& f+ V  R' R
  37.     return 0;
    0 S2 s- n9 t) I3 G
  38. }
复制代码
客户端代码:7 i) N  |7 ?4 z9 ~
  1. #include<winsock2.h>
    * d; v1 m# v; R4 a+ |# s
  2. #include<stdio.h>
    3 K9 A6 m4 }0 t/ g8 {) `$ z/ ~
  3. #pragma comment(lib, "ws2_32.lib")
    4 V! S7 Y. F# q' \7 b* T. ~( D# G
  4. void main()' h# R8 m% g% o: z" T
  5. {$ f" {2 ~  H# v" |* v& D8 Y
  6.     WSADATA wsaData;
    2 d; w- f0 T, D' ^% P
  7.     SOCKET sockClient;//客户端Socket
      \, N& i' c8 E% x2 j
  8.     SOCKADDR_IN addrServer;//服务端地址; F" g# U" @6 Y
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ; c3 M4 |1 }5 ~' v
  10.     char message[20] = "HelloSocket!";) f. L  p5 G2 V% e2 f" Y: }! j
  11.     //定义要连接的服务端地址
    . r7 n7 R) {* w$ e& p
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)% ^9 E( D: t( |. d' d8 i* V
  13.     addrServer.sin_family = AF_INET;
    ) H# Q3 [# ^. s6 k9 ?# [
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ) ^3 @* Z% w9 k  x- z6 F
  15.     //新建客户端socket6 o% }8 ~0 i' \8 Y- I
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);) R% s7 U# \0 R, ~6 u8 ~5 w7 o+ m5 G
  17.     int s = 0;
    ( }( [* g6 r$ b
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    2 O. O( K& `% M( G8 q
  19. 8 i+ I9 w5 b$ u4 }4 f
  20.     while (1){' f' l" z- Y  Y) E( V! F
  21.         //发送数据" Y4 c! v& I2 L: f, W
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
      L1 y! I& t7 r3 ~
  23.         printf("to server:");! T: d+ g- M9 k8 `/ H$ B( z9 e
  24.         scanf("%s", message);
    " t  {+ I$ W5 n7 d- h$ D

  25. " I8 E7 l% J) U. o
  26.     }3 d$ m: J3 Z) @7 ?9 S  h
  27.     //关闭socket
    & O6 }; Y  X! h: n
  28.     closesocket(sockClient);  e2 b( z/ K' Z2 C  f  f* O* T
  29.     WSACleanup();2 g4 G- S$ ]% m4 w6 ^
  30. }
复制代码
求懂的高手来解答一下。/ c! [; Q1 \2 i( r3 `
谢谢了!
4 }2 U$ c- u: x. u. ~* k* L; ?
' f" @* ?% {" w+ c' B% `

* m( I. X6 x" c) F; J
- l8 A. ^* ~( J
 楼主| 发表于 2020-5-9 02:33:06 | 显示全部楼层
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-9 02:33:20 | 显示全部楼层
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
; f4 X4 G  r4 \5 }; @recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2021-10-17 07:54 , Processed in 0.140204 second(s), 21 queries .

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