下面用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()
}
作为Linux运维,每隔一段时间就会做数据备份。通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
rsync与传统的拷贝、打包方式备份数据有一个相同的问题,就是其无法实现实时备份。
Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口。
给你一个小例子,对着修改一下吧。#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/un.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#define SERVPORT 3333
#define BACKLOG 10
#define MAX_CONNECTED_NO 10
#define MAXDATASIZE 100
int main()
{
struct sockaddr_in server_sockaddr,client_sockaddr
int sin_size,recvbytes
fd_set readfd
fd_set writefd
int sockfd,client_fd
char buf[MAXDATASIZE]
/*创建socket*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socket")
exit(1)
}
printf("socket success!,sockfd=%d\n",sockfd)
/*设置sockaddr结构*/
server_sockaddr.sin_family=AF_INET
server_sockaddr.sin_port=htons(SERVPORT)
server_sockaddr.sin_addr.s_addr=INADDR_ANY
bzero(&(server_sockaddr.sin_zero),8)
/*将本地ip地址绑定端口号*/
if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){
perror("bind")
exit(1)
}
printf("bind success!\n")
/*监听*/
if(listen(sockfd,BACKLOG)==-1){
perror("listen")
exit(1)
}
printf("listening....\n")
/*select*/
FD_ZERO(&readfd) // 将readfd 清空
FD_SET(sockfd,&readfd)//将sockfd加入到readfd集合中
while(1){
sin_size=sizeof(struct sockaddr_in)
if(select(MAX_CONNECTED_NO,&readfd,NULL,NULL,(struct timeval *)0)>0){ //第一个参数是0和sockfd的最大值加1,第二个参数是读集,第三、四个参数是写集//和异常集
if(FD_ISSET(sockfd,&readfd)>0){ // FD_ISSET 这个宏判断 sockfd 是否属于可读的文件描述符。从 sockfd 中读入, 输出到标准输出上去.
if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){ //client_sockaddr:客户端地址
perror("accept")
exit(1)
}
if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){
perror("recv")
exit(1)
}
if(read(client_fd,buf,MAXDATASIZE)<0){
perror("read")
exit(1)
}
printf("received a connection :%s",buf)
}/*if*/
close(client_fd)
}/*select*/
}/*while*/
}
开源人
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)