Linux下Socket编程 怎样实现客户端之间互相通信

如题所述

    网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

    下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。

【服务器端】
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //侦听端口
void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int ret, nLeft, length;
    SOCKET sListen, sServer; //侦听套接字,连接套接字
    struct sockaddr_in saServer, saClient; //地址信息   
    char *ptr;//用于遍历信息的指针   
    //WinSock初始化
    wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本
    ret=WSAStartup(wVersionRequested, &wsaData);
    if(ret!=0)
    {
        printf("WSAStartup() failed!\n");
        return;
    }
    //创建Socket,使用TCP协议
    sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sListen == INVALID_SOCKET)
    {
        WSACleanup();
        printf("socket() faild!\n");
        return;
    }
    //构建本地地址信息
    saServer.sin_family = AF_INET; //地址家族
    saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序
    saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址
  
    //绑定
    ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));
    if (ret == SOCKET_ERROR)
    {
        printf("bind() faild! code:%d\n", WSAGetLastError());
        closesocket(sListen); //关闭套接字
        WSACleanup();
        return;
    }
  
    //侦听连接请求
    ret = listen(sListen, 5);
    if (ret == SOCKET_ERROR)
    {
        printf("listen() faild! code:%d\n", WSAGetLastError());
        closesocket(sListen); //关闭套接字
        return;
    }
  
    printf("Waiting for client connecting!\n");
    printf("Tips: Ctrl+c to quit!\n");
    //阻塞等待接受客户端连接
 while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。
 {
  length = sizeof(saClient);
  sServer = accept(sListen, (struct sockaddr *)&saClient, &length);
  if (sServer == INVALID_SOCKET)
  {
   printf("accept() faild! code:%d\n", WSAGetLastError());
   closesocket(sListen); //关闭套接字
   WSACleanup();
   return;
  }       
  char receiveMessage[5000];
   nLeft = sizeof(receiveMessage);
  ptr = (char *)&receiveMessage;
  while(nLeft>0)
  {
   //接收数据
   ret = recv(sServer, ptr, 5000, 0);
   if (ret == SOCKET_ERROR)
   {
    printf("recv() failed!\n");
    return;
   }
   if (ret == 0) //客户端已经关闭连接
   {
    printf("Client has closed the connection\n");
    break;
   }
   nLeft -= ret;
   ptr += ret;
  }  
    printf("receive message:%s\n", receiveMessage);//打印我们接收到的消息。
  
 }
  //  closesocket(sListen);
  //  closesocket(sServer);
  //  WSACleanup();
}
【客户端】
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //侦听端口
void main()
{
   WORD wVersionRequested;
   WSADATA wsaData;
   int ret;
   SOCKET sClient; //连接套接字
   struct sockaddr_in saServer; //地址信息
   char *ptr;
   BOOL fSuccess = TRUE;
   //WinSock初始化
   wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本
   ret = WSAStartup(wVersionRequested, &wsaData);
   if(ret!=0)
   {
        printf("WSAStartup() failed!\n");
        return;
   }
   //确认WinSock DLL支持版本2.2
   if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
   {
        WSACleanup();
        printf("Invalid WinSock version!\n");
        return;
   }
   //创建Socket,使用TCP协议
   sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   if (sClient == INVALID_SOCKET)
   {
        WSACleanup();
        printf("socket() failed!\n");
        return;
   }
   //构建服务器地址信息
   saServer.sin_family = AF_INET; //地址家族
   saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序
   saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127");
   //连接服务器
   ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));
   if (ret == SOCKET_ERROR)
   {
        printf("connect() failed!\n");
        closesocket(sClient); //关闭套接字
        WSACleanup();
        return;
   }
  
  
   char sendMessage[]="hello this is client message!";
   ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0);
   if (ret == SOCKET_ERROR)
   {
        printf("send() failed!\n");
   }
   else
        printf("client info has been sent!");
   closesocket(sClient); //关闭套接字
   WSACleanup();
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-09-16
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
【服务器端】
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //侦听端口
void main()
{

LinuxC编程建立TCP连接linuxctcp
上述步骤完成后,客户端和服务器的TCP连接建立完毕。在Linux C编程中,使用TCP协议建立客户端和服务器之间连接过程虽然繁琐,但是它可以实现可靠的数据传输和优秀的网络通信,这个代价值得支付。总而言之,在Linux C编程中使用TCP协议建立客户端和服务器之间连接,可以通过socket()、bind()、listen()、accept...

linux下用socket做完了 服务器与客户端的相互通信 如何向这个程序中加...
这样你就可以在select知道哪个出现数据之后,再去操作对应的socket 你说相互通信,干吗还要中转,自己用ip:port就好了阿...要是大家都对服务器有某个请求,服务器端就用select吧..如果你处理的链接数很大,就用poll或者epoll吧,效果更好...剩下的自己去查资料......

linux C语言编程,socket实现的即使通讯系统
Socket通信创建步骤:(1)通过socket()函数创建socket(2)通过bind函数绑定socket于设备地址(3)进行读写操作read\/recv\/recvfrom write\/send\/sendto(4)close方法关闭套接字 例子如下:test1.c include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <netinet\/in.h> #in...

Linux 进程间套接字通信(Socket)基础知识
最后,服务器通过系统调用accept来接受客户的连接。它会创建一个与原有的命名套接不同的新套接字,这个套接字只用于与这个特定客户端进行通信,而命名套接字(即原先的套接字)则被保留下来继续处理来自其他客户的连接。2.客户端 基于socket的客户端比服务器端简单。同样,客户应用程序首先调用socket来...

socket编程之常用api介绍与socket、select、poll、epoll高并发服务器...
在socket编程中,构建socket pair用于连接两个缓冲区,实现进程间通信。创建socket、绑定IP和PORT、监听请求和连接、以及连接服务器,是使用socket API函数库进行服务端和客户端编程的步骤。网络字节序包括大端和小端的概念,它们在IP和端口传输中尤为重要。转换为大端字节序是网络通信的需要,反之则适用于本...

Linux编程socket通信疑问
Socket接口是TCP\/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP\/IP网络上的应用程序。要学Internet上的TCP\/IP网络编程,必须理解Socket接口。Socket接口设计者...答案就在这里:linux socket 通信编程 ---Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的...

求linux socket网络编程代码
我的 求linux socket网络编程代码 要求实现客户端与服务器之间可以即时通信,功能类似聊天,无论是客户端还是服务器均可即时发送和接受消息,两端通信均在终端下发送和接收消息,用c语言实现。代码发到邮箱:bcdongjia... 要求实现客户端与服务器之间可以即时通信,功能类似聊天,无论是客户端还是服务器均可即时发送和接受消...

TCP、UDP通信总结
接下来,将介绍Socket编程的API接口,如Linux下的socket API接口,包括创建socket、绑定socket、建立连接、监听、接收请求、关闭连接等。下面以TCP和UDP通信为例,给出本地客户端和服务端的交互实例。在TCP通信中,客户端向服务端发送数据,服务端接收到数据并打印输出。在UDP通信中,客户端和服务端之间的...

信息安全课程8:套接字(socket) 编程
客户端代码:以及服务器端代码:编译之后,就可以在两个进程间进行通信了。这个简单代码的作用是服务端收到客户端发来的字符串并回显。如果将上面代码中的while循环部分修改为:那么实现的功能就是两个进程之间进行输入交流。接下来思考问题:能不能利用上面的socket通信,获得一个shell?上面的例子中,当我们输入一个字符串...

linux send能直接发送结构体吗
Socket中的send函数可以发送字符串,但不能直接发送结构体,因此在发送端先把结构体转成字符串,然后用send发送,在接收端recv字符串,再转换成原先的结构体,这个就是解决问题的主要思路,实现中要注意的问题在下文阐述。为了客户端之间能够互相通信,实现私聊,我采用服务器转发的方式,因此用户发送的每条...

相似回答