新聞中心
Socket是網(wǎng)絡(luò)通信的重要組成部分,許多網(wǎng)絡(luò)應(yīng)用程序都采用Socket進(jìn)行數(shù)據(jù)通信。Linux作為一個(gè)開(kāi)源操作系統(tǒng),其內(nèi)核源代碼提供了豐富的網(wǎng)絡(luò)編程接口和工具函數(shù),使得開(kāi)發(fā)者能夠快速高效地開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用程序。本文將探討一種常見(jiàn)的網(wǎng)絡(luò)編程應(yīng)用——Socket數(shù)據(jù)轉(zhuǎn)發(fā)技巧。

創(chuàng)新互聯(lián)是一家專業(yè)提供大東企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為大東眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
一、Socket數(shù)據(jù)轉(zhuǎn)發(fā)的基本原理
Socket數(shù)據(jù)轉(zhuǎn)發(fā)就是將網(wǎng)絡(luò)數(shù)據(jù)包從一個(gè)Socket接口轉(zhuǎn)發(fā)到另一個(gè)Socket接口。這個(gè)過(guò)程中,需要涉及到底層的套接字編程、數(shù)據(jù)包格式解析、IPv4/IPv6協(xié)議棧處理等內(nèi)容。其中最基本的操作就是通過(guò)Socket接口收發(fā)數(shù)據(jù)。
在Linux下,Socket是通過(guò)文件描述符來(lái)進(jìn)行管理的。當(dāng)一個(gè)客戶端連接到服務(wù)器時(shí),會(huì)產(chǎn)生一個(gè)新的Socket,服務(wù)器會(huì)利用該Socket來(lái)和客戶端進(jìn)行通信。針對(duì)Socket數(shù)據(jù)轉(zhuǎn)發(fā),可以使用系統(tǒng)調(diào)用函數(shù)`accept()`和`connect()`來(lái)建立Socket連接,使用`recv()`和`send()`函數(shù)來(lái)接收和發(fā)送數(shù)據(jù)。
二、Socket數(shù)據(jù)轉(zhuǎn)發(fā)的應(yīng)用場(chǎng)景
Socket數(shù)據(jù)轉(zhuǎn)發(fā)作為一種網(wǎng)絡(luò)編程技巧,主要用于如下幾個(gè)場(chǎng)景:
1. 網(wǎng)絡(luò)代理:通過(guò)Socket數(shù)據(jù)轉(zhuǎn)發(fā),可以實(shí)現(xiàn)各種形式的網(wǎng)絡(luò)代理。例如,HTTP代理、FTP代理、SOCKS代理等。當(dāng)客戶端發(fā)起請(qǐng)求時(shí),代理服務(wù)器會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器,然后接收響應(yīng)并返回給客戶端。
2. 負(fù)載均衡:當(dāng)一臺(tái)服務(wù)器不能滿足全部請(qǐng)求時(shí),可以利用Socket數(shù)據(jù)轉(zhuǎn)發(fā)來(lái)分發(fā)請(qǐng)求到多臺(tái)服務(wù)器上,以達(dá)到負(fù)載均衡的目的。負(fù)載均衡算法可以是輪詢、加權(quán)輪詢、隨機(jī)、最小連接數(shù)等。
3. 防火墻透明代理:防火墻在網(wǎng)絡(luò)安全中起著重要的作用。有時(shí)候需要修改IP數(shù)據(jù)包的源地址和目的地址,以實(shí)現(xiàn)透明代理的目的。使用Socket數(shù)據(jù)轉(zhuǎn)發(fā)技巧,可以輕松地實(shí)現(xiàn)IP數(shù)據(jù)包的轉(zhuǎn)發(fā)和修改。
三、 Socket數(shù)據(jù)轉(zhuǎn)發(fā)的實(shí)現(xiàn)步驟
本部分將介紹在Linux環(huán)境下,如何使用Socket數(shù)據(jù)轉(zhuǎn)發(fā)技巧來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)代理。具體實(shí)現(xiàn)步驟如下:
1. 建立監(jiān)聽(tīng)Socket。
“`c
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if(socket_fd == -1){
perror(“socket”);
exit(EXIT_FLURE);
}
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1){
perror(“bind”);
exit(EXIT_FLURE);
}
if(listen(socket_fd, 5) == -1){
perror(“l(fā)isten”);
exit(EXIT_FLURE);
}
“`
使用`socket()`函數(shù)創(chuàng)建一個(gè)TCP套接字,并綁定到本地服務(wù)器地址。然后使用`listen()`函數(shù)監(jiān)聽(tīng)端口8080。
2. 接受客戶端連接。
“`c
int client_fd = accept(socket_fd, (struct sockaddr*)&client_addr, &addrlen);
if(client_fd == -1){
perror(“accept”);
exit(EXIT_FLURE);
}
“`
使用`accept()`函數(shù)接收客戶端連接,并獲取客戶端的IP地址和端口號(hào)。
3. 連接遠(yuǎn)程服務(wù)器。
“`c
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if(server_fd == -1){
perror(“socket”);
exit(EXIT_FLURE);
}
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(80);
inet_pton(AF_INET, “10.0.0.1”, &server_addr.sin_addr);
if(connect(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1){
perror(“connect”);
exit(EXIT_FLURE);
}
“`
使用`socket()`函數(shù)創(chuàng)建一個(gè)TCP套接字,并連接到遠(yuǎn)程服務(wù)器,在本例中遠(yuǎn)程服務(wù)器地址為10.0.0.1,端口號(hào)為80。
4. 接收來(lái)自客戶端的數(shù)據(jù),并將其發(fā)送到遠(yuǎn)程服務(wù)器。
“`c
char buffer[MAX_BUF_SIZE];
int n = recv(client_fd, buffer, MAX_BUF_SIZE, 0);
if(n == -1){
perror(“recv”);
exit(EXIT_FLURE);
}
if(send(server_fd, buffer, n, 0) == -1){
perror(“send”);
exit(EXIT_FLURE);
}
“`
使用`recv()`函數(shù)從客戶端接收數(shù)據(jù),然后使用`send()`函數(shù)將數(shù)據(jù)發(fā)送到遠(yuǎn)程服務(wù)器。
5. 接收來(lái)自遠(yuǎn)程服務(wù)器的數(shù)據(jù),并將其發(fā)送到客戶端。
“`c
n = recv(server_fd, buffer, MAX_BUF_SIZE, 0);
if(n == -1){
perror(“recv”);
exit(EXIT_FLURE);
}
if(send(client_fd, buffer, n, 0) == -1){
perror(“send”);
exit(EXIT_FLURE);
}
“`
使用`recv()`函數(shù)從遠(yuǎn)程服務(wù)器接收數(shù)據(jù),然后使用`send()`函數(shù)將數(shù)據(jù)發(fā)送到客戶端。
6. 關(guān)閉套接字。
“`c
close(client_fd);
close(server_fd);
“`
使用`close()`函數(shù)關(guān)閉套接字,釋放資源。
實(shí)現(xiàn)以上步驟后,通過(guò)向監(jiān)聽(tīng)的socket發(fā)送數(shù)據(jù),應(yīng)該能夠通過(guò)本機(jī)作為轉(zhuǎn)發(fā)者將數(shù)據(jù)轉(zhuǎn)發(fā)到遠(yuǎn)程服務(wù)器上了。
四、 Socket數(shù)據(jù)轉(zhuǎn)發(fā)的應(yīng)用實(shí)例
以下是一個(gè)簡(jiǎn)單的網(wǎng)頁(yè)代理程序,它監(jiān)聽(tīng)本地8080端口,將客戶端發(fā)來(lái)的HTTP請(qǐng)求轉(zhuǎn)發(fā)到遠(yuǎn)程web服務(wù)器上,并將響應(yīng)返回給客戶端。
“`c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX_BUF_SIZE 1024
int mn(int argc, char *argv[])
{
if(argc != 2){
printf(“Usage: %s \n”, argv[0]);
return 1;
}
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if(socket_fd == -1){
perror(“socket”);
return EXIT_FLURE;
}
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1){
perror(“bind”);
return EXIT_FLURE;
}
if(listen(socket_fd, 5) == -1){
perror(“l(fā)isten”);
return EXIT_FLURE;
}
printf(“Web proxy listening on port 8080…\n”);
while(1){
socklen_t addrlen = sizeof(struct sockaddr_in);
struct sockaddr_in client_addr;
int client_fd = accept(socket_fd, (struct sockaddr*)&client_addr, &addrlen);
if(client_fd == -1){
perror(“accept”);
return EXIT_FLURE;
}
char buffer[MAX_BUF_SIZE];
int n = recv(client_fd, buffer, MAX_BUF_SIZE, 0);
if(n == -1){
perror(“recv”);
return EXIT_FLURE;
}
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if(server_fd == -1){
perror(“socket”);
return EXIT_FLURE;
}
struct sockaddr_in remote_addr;
bzero(&remote_addr, sizeof(remote_addr));
remote_addr.sin_family = AF_INET;
remote_addr.sin_port = htons(80);
inet_pton(AF_INET, argv[1], &remote_addr.sin_addr);
if(connect(server_fd, (struct sockaddr*)&remote_addr, sizeof(remote_addr)) == -1){
perror(“connect”);
return EXIT_FLURE;
}
if(send(server_fd, buffer, n, 0) == -1){
perror(“send”);
return EXIT_FLURE;
}
while(1){
n = recv(server_fd, buffer, MAX_BUF_SIZE, 0);
if(n == -1){
perror(“recv”);
break;
}
if(n == 0){ // 服務(wù)器關(guān)閉連接
close(server_fd);
break;
}
if(send(client_fd, buffer, n, 0) == -1){ //將響應(yīng)發(fā)送到客戶端
perror(“send”);
return EXIT_FLURE;
}
}
close(client_fd);
}
return 0;
}
“`
運(yùn)行該程序后,可以在瀏覽器中設(shè)置代理服務(wù)器地址為本機(jī)IP地址和8080端口,就可以通過(guò)該網(wǎng)頁(yè)代理程序進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)了。
五、
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
Linux中 socket聊天室,給客戶端發(fā)消息
這題目液搜是Linux Socket 很普遍的練習(xí)
你沒(méi)貼代碼,不知道問(wèn)題在哪?
請(qǐng)?jiān)囋囅屡D簡(jiǎn)面 Server.c and Client.c
服務(wù)器:server.c
#include
#include// 包含套接字函數(shù)庫(kù)
#include
#include// 包含AF_INET相關(guān)結(jié)構(gòu)
#include// 包含AF_INET相關(guān)操作的函數(shù)
#include
#include
#include
#include
#include
#define PORT;
#define MYKEY
#define SIZE
int main()
{
int shmid;
char *shmaddr;//定義子進(jìn)程共用的共享內(nèi)存
shmid = shmget(MYKEY, SIZE, IPC_CREAT | 0600);
shmaddr= (char *) shmat(shmid, 0, 0);
if(shmid==-1)
{
printf(“shmid error\n”);
}
memset(shmaddr,0,SIZE);
int i=0;
char buf;
memset(buf,0,100);
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_sockaddr,client_sockaddr;
server_sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定義套接字類型
server_sockaddr.sin_family=AF_INET;
server_sockaddr.sin_port=PORT;
server_sockaddr.sin_addr.s_addr=INADDR_ANY;
server_len=sizeof(server_sockaddr);
//允許重復(fù)使用本地地址和套接字綁定
int j=1;
setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));
//綁定端口
if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,server_len)==-1)
{
perror(“bind:”);
exit(1);
}
if(listen(server_sockfd,5)==-1)
{
perror(“l(fā)isten:”);
exit(1);
}
printf(“Listening…\n”);
client_len=sizeof(client_sockaddr);
pid_t ppid,pid;
while(1)
{
if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_sockaddr,&client_len))==-1)
{
perror(“accept error:”);
exit(1);
}
printf(“%s登錄服務(wù)器\n”,inet_ntoa(client_sockaddr.sin_addr));
ppid=fork();
if(ppid==-1)
{
printf(“fork 1 failed:”);
}
if(ppid==0) //子進(jìn)程用于接收客戶端信息并發(fā)送
{
pid=fork();
if(pid==-1)
{
printf(“fork 2 failed:”);
exit(1);
}
int recvbytes;
if(pid==0)//子子進(jìn)程用于接收消息
{
while(1)
{
if((recvbytes=recv(client_sockfd,buf,100,0))==-1)
{
perror(“read client_sockfd failed:”);
}
// printf(“recvbytes=%d\n”,recvbytes);
usleep(10000);
printf(“client send buf=%s\n”,buf);
for(i=0;i0) //子進(jìn)程用于發(fā)送消息
{
while(1)
{
if(*(shmaddr+i*100)!=0)
{
// strcpy(&buf,shmaddr+100*i);
// buf++;
write(client_sockfd,shmaddr,SIZE);
// send(client_sockfd,buf,strlen(buf),0);
// printf(“the server is send buf=%c”,buf);
// printf(“send client :%s\n”,(shmaddr+i*100)) ;
i++;
}
}
}
}
if(ppid>0)//總父進(jìn)程返回等待接收消息
{
close(client_sockfd);
}
}
}
客戶端:client.c
#include
#include// 包含套接字函數(shù)庫(kù)
#include
#include// 包含AF_INET相關(guān)結(jié)構(gòu)
#include// 包含AF_INET相關(guān)操作的函數(shù)
#include
#include
#include
#define PORT 8888
#define IP_ADDR “192.168.110.185”
#define SIZE 10240
int main()
{
struct tm *timeptr;
time_t timeval;
char tm;
//(void)time(&timeval);
//printf(“the date is %s\n”,ctime(&timeval));
// printf(“The time is %s\n”,tm);
int sockfd; // 用于保存客戶套接字標(biāo)識(shí)符
int len;// 用于客戶消息長(zhǎng)度
struct sockaddr_in address; // 定義客戶套接字地址
int result;
sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定義套接字類型
address.sin_family = AF_INET; // 定義套接字地址中的域
address.sin_addr.s_addr = inet_addr(IP_ADDR);// 定義套接字地址
address.sin_port = htons(PORT); // 定義套接字端口
char buf; // 定義要傳送的消息
memset(buf,0,100);
char str;//存貯輸入的語(yǔ)句
char shmaddr; //接受服務(wù)器發(fā)送的全部聊天數(shù)據(jù)
int i=0;
char myname;
char say={“說(shuō):”};
printf(“歡迎來(lái)到聊天室,請(qǐng)輸入你的姓名:\n”);
scanf(“%s”,myname);
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *) &address, len); // 請(qǐng)求連接
if (result == -1)
{
perror(“Connect failed”);
return 1;
}
printf(“%s成功登錄服務(wù)器:\n”,myname);
pid_t pid;
pid=fork();
if(pid==-1)
{
printf(“fork failed”);
}
int sendbytes=0;
if(pid==0)//子進(jìn)程用于發(fā)送數(shù)據(jù)
{
while(1)
{
printf(“請(qǐng)輸入語(yǔ)句:\n”);
scanf(“%s”,str);
(void)time(&timeval);
strcpy(tm,ctime(&timeval));
strcpy(buf,myname);//姓名傳入buf中
strcat(buf,tm); //時(shí)間傳入buf中
strcat(buf,say);
strcat(buf,str); //語(yǔ)句傳入bufz中
//read(0,buf,strlen(buf));
// send(sockfd,buf,strlen(buf),0);
// getchar();
if((sendbytes=write(sockfd, buf, 100))==-1)
{
perror(“send to server failed:”);
} // 向服務(wù)器傳送消息
// printf(“sendbytes=%d\n”,sendbytes);
// printf(“buf=%s\n”,buf);
// printf(“input buf=%s\n”,buf);
usleep(1000);
memset(buf,0,100);
memset(tm,0,50);
}
}
if(pid>0) //父進(jìn)程用于接受消息并讀取
{
while(1)
{
read(sockfd,shmaddr,SIZE);
// printf(“server send shmaddr=%s\n”,shmaddr);
if(*(shmaddr+i*100)!=0)
{
printf(“%s\n”,(shmaddr+i*100)) ;
i++;
}
usleep(1000);
}
}
close(sockfd);
return 0;
}
//下面是一個(gè)實(shí)例
/**
* socket.io chat
*
*/
var web = require(‘QuickWeb’);
// undefined
var _ = undefined;
/**
* 創(chuàng)建一個(gè)房間
*
* @param {string} room 房間名稱
* @param {socket.io} io socket.io實(shí)例
*/
var Room = module.exports = function (room, io) {
// 初始化socket.io實(shí)例,僅在之一次創(chuàng)建房間時(shí)需要設(shè)置io參數(shù)
if (typeof io != ‘undefined’)
Room.prototype.io = io;
var io = this.io;
// 房間成員列表
var nicknames = this.nicknames = {};
var onlinesum = this.onlinesum = 0;
// 握手驗(yàn)證,如果是登錄用戶,則自動(dòng)獲取其昵稱
io.set(‘a(chǎn)uthorization’, function (handshakeData, callback) {
// 通過(guò)客戶端的cookie字符串來(lái)獲取其session數(shù)據(jù)
var sessionObject = handshakeData.sessionObject = web.session.getByCookie(handshakeData.headers.cookie);
// 如果不是登錄用戶,則自動(dòng)為其設(shè)置一個(gè)昵稱
var nickname = sessionObject.data.nickname;
if (typeof nickname != ‘string’ || nickname == ”)
nickname = ‘#’ + Math.floor(Math.random() * 1000) + ” + (new Date().getTime() %);
sessionObject.data.nickname = 配帶nickname;
callback(null, true);
});
/** 連接處理 */
var connectionHandle = function (socket) {
onlinesum++;
// 獲取session
var session = socket.handshake.sessionObject.data;
var nickname = session.nickname;
// 保持session,以免session過(guò)期
var hold_session = socket.handshake.sessionObject.hold;
/** 刷新在線列表 */
refresh_online = function () {
var n = 辯賣凳;
for (var i in nicknames)
n.push(i);
socket.broadcast.emit(‘online list’, n);
socket.emit(‘online list’, n);
}
// 新成員加入時(shí),通知其他成員
nicknames = socket;
refresh_online();
socket.broadcast.emit(‘system message’, nickname + ‘回來(lái)了,大家趕緊去噴他~~’);
/** 公共消息 */
socket.on(‘public message’, function (msg, cb) {
hold_session();
var timestamp = new Date().getTime();
socket.broadcast.emit(‘public message’, nickname, msg, timestamp);
cb();
});
/** 私人消息 */
socket.on(‘private message’, function (to, msg, cb) {
hold_session();
var timestamp = new Date().getTime();
var err = ”;
for (var i in to) {
var target = nicknames>;
if (target) {
cb();
target.emit(‘private message’, nickname, msg, timestamp); 攜旅
}
else {
err += ‘“’ + to + ‘”不在線\n’;
}
}
if (err != ”)
cb(err);
});
/** 斷開(kāi)來(lái)連接 */
socket.on(‘disconnect’, function () {
delete nicknames;
onlinesum–;
socket.broadcast.emit(‘system message’, nickname + ‘悄悄地離開(kāi)了?!?;
refresh_online();
});
/** 命令 */
socket.on(‘command’, function (args, cb) {
if (args.length
#include// 包含套接字函數(shù)庫(kù)
#include
#include// 包含AF_INET相關(guān)結(jié)構(gòu)
#include// 包含AF_INET相關(guān)操作的函數(shù)
#include
#include
#include
#include
#include
#define PORT;
#define MYKEY
#define SIZE
int main()
{
int shmid;
char *shmaddr;//定義子進(jìn)程共用的共享內(nèi)存
shmid = shmget(MYKEY, SIZE, IPC_CREAT | 0600);
shmaddr= (char *) shmat(shmid, 0, 0);
if(shmid==-1)
{
printf(“shmid error\n”);
}
memset(shmaddr,0,SIZE);
int i=0;
char buf;
memset(buf,0,100);
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_sockaddr,client_sockaddr;
server_sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定義套接字類型
server_sockaddr.sin_family=AF_INET;
server_sockaddr.sin_port=PORT;
server_sockaddr.sin_addr.s_addr=INADDR_ANY;
server_len=sizeof(server_sockaddr);
//允許重復(fù)使用本地地址和套接字綁定
int j=1;
setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));
//綁定端口
if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,server_len)==-1)
{
perror(“bind:”);
exit(1);
}
if(listen(server_sockfd,5)==-1)
{
perror(“l(fā)isten:”);
exit(1);
}
printf(“Listening…\n”);
client_len=sizeof(client_sockaddr);
pid_t ppid,pid;
while(1)
{
if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_sockaddr,&client_len))==-1)
{
perror(“accept error:”);
exit(1);
}
printf(“%s登錄服務(wù)器\n”,inet_ntoa(client_sockaddr.sin_addr));
ppid=fork();
if(ppid==-1)
{
printf(“fork 1 failed:”);
}
if(ppid==0) //子進(jìn)程用于接收客戶端信息并發(fā)送
{
pid=fork();
if(pid==-1)
{
printf(“fork 2 failed:”);
exit(1);
}
int recvbytes;
if(pid==0)//子子進(jìn)程用于接收消息
{
while(1)
{
if((recvbytes=recv(client_sockfd,buf,100,0))==-1)
{
perror(“read client_sockfd failed:”);
}
// printf(“recvbytes=%d\n”,recvbytes);
usleep(10000);
printf(“client send buf=%s\n”,buf);
for(i=0;i0) //子進(jìn)程用于發(fā)送消息
{
while(1)
{
if(*(shmaddr+i*100)!=0)
{
// strcpy(&buf,shmaddr+100*i);
// buf++;
write(client_sockfd,shmaddr,SIZE);
// send(client_sockfd,buf,strlen(buf),0);
// printf(“the server is send buf=%c”,buf);
// printf(“send client :%s\n”,(shmaddr+i*100)) ;
i++;
}
}
}
}
if(ppid>0)//總父進(jìn)程返回等待接收消息
{
close(client_sockfd);
}
}
}
客戶端:client.c
#include
#include// 包含套接字函數(shù)庫(kù)
#include
#include// 包含AF_INET相關(guān)結(jié)構(gòu)
#include// 包含AF_INET相關(guān)操作的函數(shù)
#include
#include
#include
#define PORT 8888
#define IP_ADDR “192.168.110.185”
#define SIZE 10240
int main()
{
struct tm *timeptr;
time_t timeval;
char tm;
//(void)time(&timeval);
//printf(“the date is %s\n”,ctime(&timeval));
// printf(“The time is %s\n”,tm);
int sockfd; // 用于保存客戶套接字標(biāo)識(shí)符
int len;// 用于客戶消息長(zhǎng)度
struct sockaddr_in address; // 定義客戶套接字地址
int result;
sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定義套接字類型
address.sin_family = AF_INET; // 定義套接字地址中的域
address.sin_addr.s_addr = inet_addr(IP_ADDR);// 定義套接字地址
address.sin_port = htons(PORT); // 定義套接字端口
char buf; // 定義要傳送的消息
memset(buf,0,100);
char str;//存貯輸入的語(yǔ)句
char shmaddr; //接受服務(wù)器發(fā)送的全部聊天數(shù)據(jù)
int i=0;
char myname;
char say={“說(shuō):”};
printf(“歡迎來(lái)到聊天室,請(qǐng)輸入你的姓名:\n”);
scanf(“%s”,myname);
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *) &address, len); // 請(qǐng)求連接
if (result == -1)
{
perror(“Connect failed”);
return 1;
}
printf(“%s成功登錄服務(wù)器:\n”,myname);
pid_t pid;
pid=fork();
if(pid==-1)
{
printf(“fork failed”);
}
int sendbytes=0;
if(pid==0)//子進(jìn)程用于發(fā)送數(shù)據(jù)
{
while(1)
{
printf(“請(qǐng)輸入語(yǔ)句:\n”);
scanf(“%s”,str);
(void)time(&timeval);
strcpy(tm,ctime(&timeval));
strcpy(buf,myname);//姓名傳入buf中
strcat(buf,tm); //時(shí)間傳入buf中
strcat(buf,say);
strcat(buf,str); //語(yǔ)句傳入bufz中
//read(0,buf,strlen(buf));
// send(sockfd,buf,strlen(buf),0);
// getchar();
if((sendbytes=write(sockfd, buf, 100))==-1)
{
perror(“send to server failed:”);
} // 向服務(wù)器傳送消息
// printf(“sendbytes=%d\n”,sendbytes);
// printf(“buf=%s\n”,buf);
// printf(“input buf=%s\n”,buf);
usleep(1000);
memset(buf,0,100);
memset(tm,0,50);
}
}
if(pid>0) //父進(jìn)程用于接受消息并讀取
{
while(1)
{
read(sockfd,shmaddr,SIZE);
// printf(“server send shmaddr=%s\n”,shmaddr);
if(*(shmaddr+i*100)!=0)
{
printf(“%s\n”,(shmaddr+i*100)) ;
i++;
}
usleep(1000);
}
}
close(sockfd);
return 0;
關(guān)于linux socket轉(zhuǎn)發(fā)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
四川成都云服務(wù)器租用托管【創(chuàng)新互聯(lián)】提供各地服務(wù)器租用,電信服務(wù)器托管、移動(dòng)服務(wù)器托管、聯(lián)通服務(wù)器托管,云服務(wù)器虛擬主機(jī)租用。成都機(jī)房托管咨詢:13518219792
創(chuàng)新互聯(lián)(www.cdcxhl.com)擁有10多年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)、開(kāi)啟建站+互聯(lián)網(wǎng)銷售服務(wù),與企業(yè)客戶共同成長(zhǎng),共創(chuàng)價(jià)值。
當(dāng)前標(biāo)題:Linux下Socket數(shù)據(jù)轉(zhuǎn)發(fā)技巧(linuxsocket轉(zhuǎn)發(fā))
網(wǎng)站網(wǎng)址:http://m.fisionsoft.com.cn/article/dhdeegi.html


咨詢
建站咨詢
