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

Linux socket 编程简单例子

2015-03-30 23:17 375 查看

Linux socket 编程简单例子

实例程序来自L L. Peterson & B S. Davie, Computer Networks: A System Approach, fifth edition, 第1.4节

client 端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define SERVER_PORT 5432
#define MAX_LINE 256

int
main(int argc, char* argv[])
{
FILE *fp;
struct hostent *hp;
struct sockaddr_in sin;
char *host;
char buf[MAX_LINE];
int s;
int len;

if (argc==2) {
host = argv[1];
} else {
fprintf(stderr, "usage: simplex-talk host\n");
exit(1);
}

/* translate host name into peer's IP address */
hp = gethostbyname(host);
if(!hp) {
fprintf(stderr, "simplex-talk: unkown host : %s\n", host);
exit(1);
}

/* build address data structure */
bzero((char*)&sin, sizeof(sin));
sin.sin_family = AF_INET;
bcopy(hp->h_addr, (char*)&sin.sin_addr, hp->h_length);
sin.sin_port = htons(SERVER_PORT);

/* active open */
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror("simplex-talk: socket");
exit(1);
}
if (connect(s, (struct sockaddr*)&sin, sizeof(sin)) < 0) {
perror("simplex-talk: connect");
close(s);
exit(1);
}

/* main loop */
while (fgets(buf, sizeof(buf), stdin)) {
buf[MAX_LINE-1] = '\0';
len = strlen(buf) + 1;
send(s, buf, len, 0);
}
}


server端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define SERVER_PORT 5432
#define MAX_PENDING 5
#define MAX_LINE 256

int
main()
{
struct sockaddr_in sin, csin;
char buf[MAX_LINE];
int len;
int s, new_s;
int on;

/* build address data structure */
bzero((char*)&sin, sizeof(sin));
sin.sin_family = AF_INET;
//  sin.sin_addr.s_addr = inet_addr("127.0.0.1");;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(SERVER_PORT);

/* setup passive open */
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror("simplex-talk: socket");
exit(1);
}

/* enable address reuse */
// http://www.ibm.com/developerworks/cn/linux/l-sockpit/ on = 1;
setsockopt( s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
if ((bind(s, (struct sockaddr*)&sin, sizeof(sin))) < 0) {
perror("simplex-talk: bind");
exit(1);
}
listen(s, MAX_PENDING);

/* wait for connection, then receive and print text */
while(1) {
if ((new_s = accept(s, (struct sockaddr*)&csin, &len)) < 0) {
perror("simplex-talk: accept");
exit(1);
}
while (len = recv(new_s, buf, sizeof(buf), 0)) {
fputs(buf, stdout);
}
close(new_s);
}
}


原书中程序的accept函数直接用sin做参数,运行时会出现错误;新建立一个sockaddr_in变量csin,传给accept函数做参数,错误消失。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: