您的位置:首页 > 运维架构 > Linux

linux下socket编程示例

2012-05-08 16:47 363 查看
本示例为 Client/Server 结构,通过代码演示 Client 如何建立连接,并向远程端发送数据;Server 端如何侦听系统连接请求,接收请求并建立连接,进而获取客户端发来的数据。代码虽短,却描述了整个通信过程,可对Linux 下 网络编程起个抛砖引玉的作用吧 :-)

Client 端代码:

--------------------------------------------------------------

/* sockclnt.c*/

#include <string.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h> /*for struct sockaddr_in*/

#define DEST_IP "65.52.207.217"

#define DEST_PORT 4000

int main()

{

int res;

int sockfd;

struct sockaddr_in dest_addr;

char *msg = "Hello world/n";

int len, bytes_sent;

/* 取得一个套接字*/

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd == -1) {

perror("socket()");

exit(1);

}

/* 设置远程连接的信息*/

dest_addr.sin_family = AF_INET; /* 注意主机字节顺序*/

dest_addr.sin_port = htons(DEST_PORT); /* 远程连接端口, 注意网络字节顺序*/

dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); /* 远程 IP 地址, inet_addr() 会返回网络字节顺序*/

bzero(&(dest_addr.sin_zero), 8); /* 其余结构须置 0*/

/* 连接远程主机,出错返回 -1*/

res = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in));

if (res == -1) {

perror("connect()");

exit(1);

}

len = strlen(msg);

bytes_sent = send(sockfd, /* 连接描述符*/

msg, /* 发送内容*/

len, /* 发关内容长度*/

0); /* 发送标记, 一般置 0*/

/* 关闭连接*/

close(sockfd);

}

Server 端的代码:

-----------------------------------------------------------------------------------------

/* socksrv.c*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h> /* for struct sockaddr_in*/

#define BACKLOG 10

#define MYPORT 4000

int main()

{

char *addr;

int sockfd;

int new_fd;

struct sockaddr_in my_addr, their_addr;

int res;

int sin_size;

char *buf;

/* 取得套接字描述符*/

sockfd = socket(AF_INET, /* domain*/

SOCK_STREAM, /* type*/

0); /* protocol*/

if (sockfd == -1) {

perror("socket");

exit(1);

}

/* Init sockaddr_in */

my_addr.sin_family = AF_INET; /* 注意: 应使用主机字节顺序*/

my_addr.sin_port = htons(MYPORT); /* 注意: 应使用网络字节顺序*/

my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 使用自己的 IP 地址 */

bzero(&(my_addr.sin_zero), 8); /* 结构的其余的部分须置 0*/

/* 指定一个套接字使用的地址及端口*/

res = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));

if (res == -1) {

perror("bind");

exit(1);

}

/* 监听请求, 等待连接*/

res = listen(sockfd,

BACKLOG); /* 未经处理的连接请求队列可容纳的最大数目*/

if (res == -1) {

perror("listen");

exit(1);

}

/* 接受对方的连接请求, 建立连接,返回一个新的连接描述符.

* 而第一个套接字描述符仍在你的机器上原来的端口 listen()

*/

sin_size = sizeof(struct sockaddr_in);

new_fd = accept(sockfd, (void *)&their_addr, &sin_size);

buf = (char *)malloc(255);

if (buf == NULL) {

printf("malloc failed/n");

exit(1);

}

/* 接受对方发来的数据*/

res = recv(new_fd, buf, 255, 0);

if (res == -1) {

perror("recv()");

exit(1);

}

/* 关闭本次连接*/

close(new_fd);

/* 关闭系统监听*/

close(sockfd);

printf("recv data:%s/n", buf);

free(buf);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: