下面用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()
{
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()
}
tcp/ip 是不分系统的吧……网络的数据交互,与系统无关,不明白你的这个怎么实现问的是什么地方怎么实现?
client.c 编译为 Windows 可以运行的程序就行了。server.c 编译为 Linux 下面可以运行的程序。只要你能保证这两个程序代码确实有效。
Windows之间可以利用“网络邻居”来实现资源共享,而Linux之间可以使用NFS来实现资源共享。
Linux可以通过Samba来实现和Windows主机互通有无的。Samba采用Client/Server架构,执行Samba客户端程序,就可以访问Windows主机上的共享资源;而运行Samba服务器,Windows主机就可以访问Linux上的共享资源。Samba 为 UNIX 和 Microsoft Windows 之间的通信架起了一座桥梁。
它是一套程序,支持基于 UNIX 的主机与基于 Windows 的主机共享文件与打印机。除了共享文件和打印机之外,Samba 还可以充当 Windows 域控制器。(Domain Controller),这样就可以通过 UNIX 服务器管理 Windows 网络。作为域控制器, Samba 让自己可以为漫游的(roaming)或者本地的用户创建登录配置文件(login profiles)
采用多线程方式进行管道通信交叉,也就是说,你在驱动里面设置三个thread或者更多,然后有名管道通信,试试吧。说实话,这和你的代码和实现的功能有关,只能大概的说两句,希望能够帮到你。至于分,大家都是交流技术,对那个倒是不看重。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)