服务器端代码:server.c
服务器,启动后,就处于 监听状态
每当有一个客户端进行连接时,server 都会单独 fork() 一个子进程, 在子进程中,进行具体的数据收发处理
-
// server.c
-
-
#include <stdio.h>
-
#include <sys/socket.h>
-
#include <sys/un.h>
-
#include <unistd.h>
-
#include <netinet/in.h>
-
#include <linux/ipc.h>
-
#include <linux/msg.h>
-
#include <sys/types.h>
-
#define MYPORT 6666
-
#define MYIP "192.168.45.11"
// 定义信息传输的格式
-
struct msg{
-
long mtype;
-
int cmd;
-
char s[3000];
-
};
-
struct msg m1,m2;
-
-
int main()
-
{
-
pid_t pid;
-
int sock;
-
int conn;
-
int addrlen;
-
int ret;
-
int opt;
-
int optlen;
-
struct sockaddr_in addr;
-
-
-
memset(&addr, 0x0, sizeof(addr));
-
addr.sin_family=AF_INET;
-
addr.sin_port=htons(MYPORT);
-
addr.sin_addr.s_addr=htonl(INADDR_ANY);
-
-
sock=socket(PF_INET, SOCK_STREAM, 0);
-
if(sock<0)
-
{
-
perror("socket"); return(-1);
-
}
-
-
/*绑定端口前,清除之前的绑定*/
-
opt=1;
-
optlen=sizeof(opt);
-
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, optlen);
-
-
/* the next is bind the port */
-
ret=bind(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr));
-
if(ret)
-
{
-
perror("bind"); return(-1);
-
}
-
ret=listen(sock, 5);
-
if(ret)
-
{
-
perror("listen"); return(-1);
-
}
-
-
while(1)
-
{
-
conn=accept(sock, (struct sockaddr *)&addr, &addrlen);
-
if(conn<0)
-
{
-
perror("accept");
-
break;
-
}
-
pid=fork();
-
if(pid==0)
-
{ /* children */
-
close(sock);
-
ret=read(conn, &m1, sizeof(struct msg));
-
-
disp(&m1);
-
msg_contrl();
-
write(conn, &m2, sizeof(struct msg));
-
fflush(stdout);
-
close(conn);
-
exit(0);
-
}
-
close(conn);
-
}
-
}
-
-
-
disp(struct msg *m)
-
{
-
printf("\nreceive from client:\n");
-
printf("\nm.cmd=%d",m->cmd);
-
printf("\n---------------------------------------\n");
-
fflush(stdout);
-
return(0);
-
}
-
msg_contrl()
-
{
-
int msgid1;
-
key_t key1;
-
m1.mtype=1234;
-
key1=ftok("/tmp",'b');
-
msgid1=msgget(key1, IPC_CREAT|0666);
-
msgsnd(msgid1, &m1, sizeof(struct msg)-sizeof(long),0);
-
-
-
-
int msgid2;
-
key_t key2;
-
m2.mtype=1235;
-
key2=ftok("/tmp",'c');
-
msgid2=msgget(key2, IPC_CREAT|0666);
-
msgrcv(msgid2, &m2, sizeof(struct msg)-sizeof(long),m2.mtype,0);
-
//printf("\nm2.s:%s",m2.s);
-
//printf("\nm2.cmd:%d",m2.cmd);
-
-
return 0;
-
-
}
客户端代码:client.c
-
-
// client.c
-
-
#include <stdio.h>
-
#include <sys/socket.h>
-
#include <sys/un.h>
-
#include <unistd.h>
-
#include <netinet/in.h>
-
#define MYPORT 6666
-
#define MYIP "192.168.45.11"
-
/* this is set the package form*/
-
struct msg{
-
long mtype;
-
int cmd;
-
char s[3000];
-
};
-
struct msg m1,m2;
-
-
int main()
-
{
-
pid_t pid;
-
int sock;
-
int conn;
-
int addrlen;
-
int ret;
-
struct sockaddr_in addr;
-
-
memset(&addr, 0x0, sizeof(addr));
-
addr.sin_family=AF_INET;
-
addr.sin_port=htons(MYPORT);
-
addr.sin_addr.s_addr=inet_addr(MYIP);
-
-
sock=socket(PF_INET, SOCK_STREAM, 0);
-
if(sock<0)
-
{
-
perror("socket"); return(-1);
-
}
-
ret=connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr));
-
if(ret)
-
{
-
perror("connect");
-
return(-1);
-
}
-
input(&m1);
-
write(sock, &m1, sizeof(struct msg));
-
read(sock, &m2, sizeof(struct msg));
-
display(&m2);
-
return 0;
-
-
}
-
-
//this is what you want to input
-
input(struct msg *m)
-
{
-
printf("\ncmd:");
-
scanf("%d",&m->cmd);
-
}
-
display(struct msg *m)
-
{
-
printf("\nrecieved from server:\n");
-
printf("\n m.s:%s\n",&m->s);
-
}
阅读(2310) | 评论(0) | 转发(0) |