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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。/ s6 W9 ?4 _/ r5 ]
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。, |' h9 |- o+ M0 V
Talk is cheak , show me the code.
$ |3 a) Z( j. _: s3 d服务端代码:
" T  G8 [% `. Q& U
  1. #include<stdlib.h>, {& i  S' I" Y1 @) F9 I1 I% _4 u
  2. #include<WinSock2.h>6 L  o4 X+ y* |1 }! p0 o: ?1 N* p
  3. #pragma comment(lib,"ws2_32.lib")' ~2 T8 @( \  n* h; q: F& o
  4. int main(){
    & ?$ {) {0 @9 W* j& ~* T# z8 y+ E
  5.     WSADATA wsd;
    3 ~: g$ g7 [' p7 j1 Y" U) W
  6.     SOCKET sockServer;
    1 T6 B, n4 H1 d9 U' O
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    4 q1 V" G' \- q+ s7 D# Z/ F" E5 D
  8.     SOCKET sockClient;
    " j5 x$ T# A: h. z6 t) w7 X9 n4 m
  9.     SOCKADDR_IN clientaddr;
    ! Z0 e2 B( F' \* Q8 P' T6 Y, t2 h" v
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* e0 |, q% B7 @# \# q8 W9 [4 `; J  y
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket- _- E# F2 X4 L* M  ^
  12. . n( \0 Y# d; O0 J5 V# R
  13. ) J' S. r, ?0 n' W( j4 _
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    $ R3 k/ ~/ s0 t( \; x; y
  15.         printf("Socket has been created :%d", sockServer);
    ( u' D! ^- v. z) @! i' j, c% s. _9 h( C
  16.     }
      M: a2 \7 z1 u3 f) F0 i
  17.     else{
    5 h; p4 T% {% l  [
  18.         printf("Socket create failed.");
    % g7 \9 z+ N- O, G8 D* V
  19.         exit(0);
    # v7 L9 A% I+ Y  j8 G
  20.     }! ], h$ A; A" q
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    " {! e, R8 t! l+ M& F* o
  22.     serveraddr.sin_family = AF_INET;
    9 r9 |! e' |0 f6 O
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    ! v& \: `: `3 [. Z& p6 g. f
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));6 `, k6 E) i# g; V: e  b
  25.     char recvBuf[100];- |) F: }1 G& L; `! q5 M
  26.     int len = sizeof(SOCKADDR);, M/ [  u' l( l7 @* n( ^0 }
  27.     listen(sockServer, 5);//5为等待连接数
      L/ `+ g( N+ w5 G- W
  28.     while (1){9 x+ @/ X3 Z3 G0 X4 X6 n
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    9 ?9 f9 v, ^" z" f! k0 M* Z
  30.         //接收客户端数据
    $ F$ _' u+ l7 {* H2 }
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    $ O7 }* r7 b% M" k# F1 i
  32.         printf("to me:%s\n",recvBuf);2 c7 f2 R% {9 K  X1 Q
  33.         memset(recvBuf, 0, 100);
    % X' e& k2 t2 e; h. r8 A. u) `0 A
  34.     }
    " x" p0 T6 O- V
  35.     closesocket(sockClient);
    ( R# A  |# ?( Z% r* o" o
  36.     system("pause");
    ( ?6 o! p& D; T& b% ?2 e# t/ ~2 p
  37.     return 0;
    5 [- o! N/ @! }5 v$ H( P# ^1 o7 w' j
  38. }
复制代码
客户端代码:- [+ F# d; e0 f$ _
  1. #include<winsock2.h>
    # x$ V# P3 ^8 ~8 Y" H: T9 _  F: _7 d
  2. #include<stdio.h>
    . S4 o% G! U* E: V
  3. #pragma comment(lib, "ws2_32.lib")
    4 o! Y3 l6 C$ q4 U/ J: O" e7 n
  4. void main()
    7 a6 ?) Q) f7 W
  5. {7 v" H6 k. W: n5 X7 z) Z7 v
  6.     WSADATA wsaData;
    , f9 u3 ~. \% r0 v& A. e
  7.     SOCKET sockClient;//客户端Socket
    $ p: \; Q* C& p, ~7 |
  8.     SOCKADDR_IN addrServer;//服务端地址  v; o5 M9 Z; Q4 M1 ^& l) f
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    3 o7 W2 T5 g' Q, d; w2 O
  10.     char message[20] = "HelloSocket!";
    ! Q/ ~1 Q- e: [5 P
  11.     //定义要连接的服务端地址# A# `$ _0 M1 @& D0 C
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    2 k, }3 \+ g* q+ S# e! s. Z
  13.     addrServer.sin_family = AF_INET;
    8 A2 X, V7 ]9 S% S
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    , ]" W( h7 ^" {) a' [( z/ l& z2 v
  15.     //新建客户端socket
    4 b. u* Z& i9 V2 b) B' \
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);$ L) M/ C2 y; x) i4 w6 R5 }5 Z* |
  17.     int s = 0;
    ( J0 {, a( F4 K! w" c% B  v6 n8 }
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
      w) [# {- U/ ]
  19. & w: }; a9 U3 t4 D
  20.     while (1){
    7 a2 K9 j  [( C6 c
  21.         //发送数据$ W$ {4 W- U- F, j5 A
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ) ]6 G: l( q; v! `+ F5 d
  23.         printf("to server:");
    1 G: o6 P4 z  M( K0 z( N
  24.         scanf("%s", message);
    / z) w# r0 \4 I+ l

  25. 4 B7 ^& Q2 r$ G' H
  26.     }
    / l" r# J. `2 s6 t
  27.     //关闭socket/ k* j  C) Y! [# X4 D5 B
  28.     closesocket(sockClient);
    ; p( |, a9 K7 {4 V1 j2 h
  29.     WSACleanup();* H# W6 V, Z% P/ y, x' H0 P7 ^
  30. }
复制代码
求懂的高手来解答一下。
( ]$ F; Z* O: f# S' J6 c谢谢了!/ k. N' |) Z2 ?( l9 P5 ^( k

1 `. y) R0 T, J$ w
; @; v1 M  q% w( R/ k. ]
0 u& n# T" s! f, V2 f4 h5 U) Q
分享到:  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 v9 y3 \$ u3 Q# |# |3 _
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-6-19 22:36 , Processed in 0.051597 second(s), 18 queries .

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