虚拟机(vmware)下实现linux网络编程(使用socket编程)

先是建立服务器程序:

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

 

#define MYPORT 5858
#define BACKLOG 10
#define MAXSIZE 80
#define BUFSIZE 100

//单独的数据处理 就是简单的从client端接受数据, 然后又发给client端

void str_ser(int new_fd) {
char buf[MAXSIZE];
int n = 0;

        while(1) {
if((n=recv(new_fd, buf, MAXSIZE, 0)) == 0) {
printf("error in recv!\n");
return ;
}
printf("server data is %s", buf);
send(new_fd, buf, n, 0);
bzero(buf, MAXSIZE);
}
}

int main() {
int socketfd, new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
pid_t pid;

        if((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("error in socket function!\n");
exit(1);
}

        my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(&(my_addr.sin_zero), 8);

        if((bind(socketfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))) < 0) {
printf("error in bind function!\n");
exit(1);
}

        if(listen(socketfd, BACKLOG) < 0) {
printf("error in listen function!\n");
exit(1);
}

        while(1) {
printf("start accept\n");
sin_size = sizeof(struct sockaddr_in);
if((new_fd=accept(socketfd, (struct sockaddr *)&their_addr ,&sin_size)) < 0) {
printf("error in accept() function!\n");
exit(1);
}

                if((pid=fork())==0) {
close(socketfd);
str_ser(new_fd);
close(new_fd);
exit(0);
}else {
close(new_fd);

                }
}

        close(socketfd);
exit(0);
}
//下面是client端的程序:                                                                              boxiang.blogbus.com

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

#include <errno.h>

#define MAXSIZE 100
#define MYPORT 5858


extern int errno;

//单独处理数据的函数,发给服务器, 然后接受服务器的数据

void str_cli(int sockfd) {
char sends[MAXSIZE];
char recvs[MAXSIZE];
int n=0;
while(fgets(sends, MAXSIZE, stdin) != NULL) {
printf("client data is %s\n", sends);
send(sockfd, sends, strlen(sends), 0);
if((n=recv(sockfd, recvs, MAXSIZE, 0)) == 0) {
printf("error in recv !\n");
exit(1);
}

                recvs[n] = 0;
printf("client recv data is %s\n", recvs);
//fputs(recvs, stdout);
bzero(recvs, n);
bzero(sends, MAXSIZE);
}
}


int main(int args, char *argv[]) {
int sockfd;
int ret;
struct servent *serv;
struct hostent *sh;
struct in_addr **addrs;
struct sockaddr_in ser_addr;
struct sockaddr_in addr;
char **addres;
char ip[]="127.0.0.1";

        if(args != 2) {
printf("error in paramter!\n");
exit(1);
}

        /*if((sh=gethostbyaddr((char*)&addr.sin_addr, sizeof(addr.sin_addr), AF_INET)) == NULL) {
printf("error in gethostbyaddr!\n");
exit(1);
}*/

        /*if((serv=getservbyname(sh->h_name, NULL)) == NULL) {
printf("error in getservbyname!\n");
perror("getservbyname");
exit(1);

        }*/

///首先通过服务器域名获得其IP地址,然后创建一个socket,调用connect函数与服务器建立连

//接, 要进行connect链接 首先要有服务器的ip和port端口,port首先可以自己定义,看看服务器端口,端口port定义是5858, 所以client端口port也就是5858,(说点小插曲,以前想通过gethostbyaddr,获得h->home, 肯定是可以的 但是hostent数据结构里面是没有port的,我就想通过getservbyname,因为servent里面有port这个属性,可是就是得不到 呵呵呵 真是笨啊 根本就得不到 getservent只能获得相应服务的对应端口)   地方必须说一下,我自己理解是gethostbyname是先在/etc/hosts文件里面去读取 你对应的域名,得到ip地址, 如果没有就是去电脑的dns里面去找域名相应的ip地址,而那个getservbyname是去/etc/services去读取相应服务的端口啊

 


if((sh=gethostbyname(argv[1]))==NULL) {
printf("error in gethostbyname !\n");
exit(1);
}
addrs = (struct in_addr **)sh->h_addr_list;


for(; (*addrs)!=NULL; addrs++) {
if((sockfd=socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("error in socket!\n");
exit(1);
}
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(MYPORT);
//memcpy(&(ser_addr.sin_addr),(struct in_addr *)ip, sizeof(struct in_addr));
printf("ip is :%s\n", inet_ntoa(**addrs));
memcpy(&(ser_addr.sin_addr), *addrs, sizeof(struct in_addr));
ret = connect(sockfd, (struct sockaddr*)&ser_addr, sizeof(struct sockaddr));
if(ret == 0) {
printf("is ok\n");
break;

                }else {
printf("error in connect function!\n");
close(sockfd);
}
}

        if((*addrs) == NULL) {
printf("error in found addr and port in this server!\n");
exit(1);
}

        str_cli(sockfd);

        close(sockfd);
exit(0);
}

转载于:https://www.cnblogs.com/flyxiang2010/archive/2010/12/17/1909130.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值