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

創(chuàng)新互聯(lián)是一家專業(yè)提供大東企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為大東眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。
一、Socket數(shù)據(jù)轉(zhuǎn)發(fā)的基本原理
Socket數(shù)據(jù)轉(zhuǎn)發(fā)就是將網(wǎng)絡(luò)數(shù)據(jù)包從一個Socket接口轉(zhuǎn)發(fā)到另一個Socket接口。這個過程中,需要涉及到底層的套接字編程、數(shù)據(jù)包格式解析、IPv4/IPv6協(xié)議棧處理等內(nèi)容。其中最基本的操作就是通過Socket接口收發(fā)數(shù)據(jù)。
在Linux下,Socket是通過文件描述符來進行管理的。當一個客戶端連接到服務(wù)器時,會產(chǎn)生一個新的Socket,服務(wù)器會利用該Socket來和客戶端進行通信。針對Socket數(shù)據(jù)轉(zhuǎn)發(fā),可以使用系統(tǒng)調(diào)用函數(shù)`accept()`和`connect()`來建立Socket連接,使用`recv()`和`send()`函數(shù)來接收和發(fā)送數(shù)據(jù)。
二、Socket數(shù)據(jù)轉(zhuǎn)發(fā)的應(yīng)用場景
Socket數(shù)據(jù)轉(zhuǎn)發(fā)作為一種網(wǎng)絡(luò)編程技巧,主要用于如下幾個場景:
1. 網(wǎng)絡(luò)代理:通過Socket數(shù)據(jù)轉(zhuǎn)發(fā),可以實現(xiàn)各種形式的網(wǎng)絡(luò)代理。例如,HTTP代理、FTP代理、SOCKS代理等。當客戶端發(fā)起請求時,代理服務(wù)器會將請求轉(zhuǎn)發(fā)到目標服務(wù)器,然后接收響應(yīng)并返回給客戶端。
2. 負載均衡:當一臺服務(wù)器不能滿足全部請求時,可以利用Socket數(shù)據(jù)轉(zhuǎn)發(fā)來分發(fā)請求到多臺服務(wù)器上,以達到負載均衡的目的。負載均衡算法可以是輪詢、加權(quán)輪詢、隨機、最小連接數(shù)等。
3. 防火墻透明代理:防火墻在網(wǎng)絡(luò)安全中起著重要的作用。有時候需要修改IP數(shù)據(jù)包的源地址和目的地址,以實現(xiàn)透明代理的目的。使用Socket數(shù)據(jù)轉(zhuǎn)發(fā)技巧,可以輕松地實現(xiàn)IP數(shù)據(jù)包的轉(zhuǎn)發(fā)和修改。
三、 Socket數(shù)據(jù)轉(zhuǎn)發(fā)的實現(xiàn)步驟
本部分將介紹在Linux環(huán)境下,如何使用Socket數(shù)據(jù)轉(zhuǎn)發(fā)技巧來實現(xiàn)網(wǎng)絡(luò)代理。具體實現(xiàn)步驟如下:
1. 建立監(jiān)聽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)建一個TCP套接字,并綁定到本地服務(wù)器地址。然后使用`listen()`函數(shù)監(jiān)聽端口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地址和端口號。
3. 連接遠程服務(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)建一個TCP套接字,并連接到遠程服務(wù)器,在本例中遠程服務(wù)器地址為10.0.0.1,端口號為80。
4. 接收來自客戶端的數(shù)據(jù),并將其發(fā)送到遠程服務(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ā)送到遠程服務(wù)器。
5. 接收來自遠程服務(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ù)從遠程服務(wù)器接收數(shù)據(jù),然后使用`send()`函數(shù)將數(shù)據(jù)發(fā)送到客戶端。
6. 關(guān)閉套接字。
“`c
close(client_fd);
close(server_fd);
“`
使用`close()`函數(shù)關(guān)閉套接字,釋放資源。
實現(xiàn)以上步驟后,通過向監(jiān)聽的socket發(fā)送數(shù)據(jù),應(yīng)該能夠通過本機作為轉(zhuǎn)發(fā)者將數(shù)據(jù)轉(zhuǎn)發(fā)到遠程服務(wù)器上了。
四、 Socket數(shù)據(jù)轉(zhuǎn)發(fā)的應(yīng)用實例
以下是一個簡單的網(wǎng)頁代理程序,它監(jiān)聽本地8080端口,將客戶端發(fā)來的HTTP請求轉(zhuǎn)發(fā)到遠程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;
}
“`
運行該程序后,可以在瀏覽器中設(shè)置代理服務(wù)器地址為本機IP地址和8080端口,就可以通過該網(wǎng)頁代理程序進行數(shù)據(jù)轉(zhuǎn)發(fā)了。
五、
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù)!
Linux中 socket聊天室,給客戶端發(fā)消息
這題目液搜是Linux Socket 很普遍的練習(xí)
你沒貼代碼,不知道問題在哪?
請試試下臘簡面 Server.c and Client.c
服務(wù)器:server.c
#include
#include// 包含套接字函數(shù)庫
#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;//定義子進程共用的共享內(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) //子進程用于接收客戶端信息并發(fā)送
{
pid=fork();
if(pid==-1)
{
printf(“fork 2 failed:”);
exit(1);
}
int recvbytes;
if(pid==0)//子子進程用于接收消息
{
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) //子進程用于發(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)//總父進程返回等待接收消息
{
close(client_sockfd);
}
}
}
客戶端:client.c
#include
#include// 包含套接字函數(shù)庫
#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; // 用于保存客戶套接字標識符
int len;// 用于客戶消息長度
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;//存貯輸入的語句
char shmaddr; //接受服務(wù)器發(fā)送的全部聊天數(shù)據(jù)
int i=0;
char myname;
char say={“說:”};
printf(“歡迎來到聊天室,請輸入你的姓名:\n”);
scanf(“%s”,myname);
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *) &address, len); // 請求連接
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)//子進程用于發(fā)送數(shù)據(jù)
{
while(1)
{
printf(“請輸入語句:\n”);
scanf(“%s”,str);
(void)time(&timeval);
strcpy(tm,ctime(&timeval));
strcpy(buf,myname);//姓名傳入buf中
strcat(buf,tm); //時間傳入buf中
strcat(buf,say);
strcat(buf,str); //語句傳入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) //父進程用于接受消息并讀取
{
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;
}
//下面是一個實例
/**
* socket.io chat
*
*/
var web = require(‘QuickWeb’);
// undefined
var _ = undefined;
/**
* 創(chuàng)建一個房間
*
* @param {string} room 房間名稱
* @param {socket.io} io socket.io實例
*/
var Room = module.exports = function (room, io) {
// 初始化socket.io實例,僅在之一次創(chuàng)建房間時需要設(shè)置io參數(shù)
if (typeof io != ‘undefined’)
Room.prototype.io = io;
var io = this.io;
// 房間成員列表
var nicknames = this.nicknames = {};
var onlinesum = this.onlinesum = 0;
// 握手驗證,如果是登錄用戶,則自動獲取其昵稱
io.set(‘a(chǎn)uthorization’, function (handshakeData, callback) {
// 通過客戶端的cookie字符串來獲取其session數(shù)據(jù)
var sessionObject = handshakeData.sessionObject = web.session.getByCookie(handshakeData.headers.cookie);
// 如果不是登錄用戶,則自動為其設(shè)置一個昵稱
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過期
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);
}
// 新成員加入時,通知其他成員
nicknames = socket;
refresh_online();
socket.broadcast.emit(‘system message’, nickname + ‘回來了,大家趕緊去噴他~~’);
/** 公共消息 */
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);
});
/** 斷開來連接 */
socket.on(‘disconnect’, function () {
delete nicknames;
onlinesum–;
socket.broadcast.emit(‘system message’, nickname + ‘悄悄地離開了?!?;
refresh_online();
});
/** 命令 */
socket.on(‘command’, function (args, cb) {
if (args.length
#include// 包含套接字函數(shù)庫
#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;//定義子進程共用的共享內(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) //子進程用于接收客戶端信息并發(fā)送
{
pid=fork();
if(pid==-1)
{
printf(“fork 2 failed:”);
exit(1);
}
int recvbytes;
if(pid==0)//子子進程用于接收消息
{
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) //子進程用于發(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)//總父進程返回等待接收消息
{
close(client_sockfd);
}
}
}
客戶端:client.c
#include
#include// 包含套接字函數(shù)庫
#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; // 用于保存客戶套接字標識符
int len;// 用于客戶消息長度
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;//存貯輸入的語句
char shmaddr; //接受服務(wù)器發(fā)送的全部聊天數(shù)據(jù)
int i=0;
char myname;
char say={“說:”};
printf(“歡迎來到聊天室,請輸入你的姓名:\n”);
scanf(“%s”,myname);
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *) &address, len); // 請求連接
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)//子進程用于發(fā)送數(shù)據(jù)
{
while(1)
{
printf(“請輸入語句:\n”);
scanf(“%s”,str);
(void)time(&timeval);
strcpy(tm,ctime(&timeval));
strcpy(buf,myname);//姓名傳入buf中
strcat(buf,tm); //時間傳入buf中
strcat(buf,say);
strcat(buf,str); //語句傳入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) //父進程用于接受消息并讀取
{
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ù)器托管、移動服務(wù)器托管、聯(lián)通服務(wù)器托管,云服務(wù)器虛擬主機租用。成都機房托管咨詢:13518219792
創(chuàng)新互聯(lián)(www.cdcxhl.com)擁有10多年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗、開啟建站+互聯(lián)網(wǎng)銷售服務(wù),與企業(yè)客戶共同成長,共創(chuàng)價值。
當前題目:Linux下Socket數(shù)據(jù)轉(zhuǎn)發(fā)技巧(linuxsocket轉(zhuǎn)發(fā))
標題路徑:http://m.5511xx.com/article/dhdeegi.html


咨詢
建站咨詢
