网络编程概念介绍

网络编程概念介绍

草木瓜

写文章真累,写好文章更是很累,怪不得大家都喜欢贴来贴去,或者稍加修改罢了。
网络编程这块是老生常谈,个人觉得《Beej网络socket编程指南》算是经典了。网上
一搜一大堆,这里也顺应大流,不写了,贴一下。

下面给出一个网络交互的完整示例,在HP UNIX编译调试通过!对照以前的网络概念,
还有经典的文章就应该很清楚了。


server.c
-----------------------------------------------------


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

#define PORT 16666 /*定义用户连接端口*/
#define BACKLOG 1 /*多少等待连接控制*/
int main()
{
int listen_fd; /* listen_fd 监听返回的文件描述符 */
int newconn_fd; /* newconn_fd 新连接返回的文件描述符 */
struct sockaddr_in serv_addr; /* 服务器的地址信息 */
struct sockaddr_in client_addr; /* 请求连接客户端的地址信息 */
int sin_size;

if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}

serv_addr.sin_family = AF_INET; /* host byte order */
serv_addr.sin_port = htons(PORT); /* 转变为网络字节顺序 */
serv_addr.sin_addr.s_addr = INADDR_ANY; /* 本地IP地址 */
bzero(&(serv_addr.sin_zero),sizeof(serv_addr.sin_zero)); /* 清空数据空间 */

if (bind(listen_fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr))== -1)
{
perror("bind");
exit(1);
}

if (listen(listen_fd, BACKLOG) == -1)
{
perror("listen");
exit(1);
}

while(1)
{ /* 主循环 accept() */
sin_size = sizeof(struct sockaddr_in);
if ((newconn_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &sin_size)) == -1)
{
perror("accept");
continue;
}
printf("server: got connection from %s/n", inet_ntoa(client_addr.sin_addr));
if (!fork())
{ /* 子进程 */
if (send(newconn_fd, "You connected the server!/n", 26, 0) == -1) perror("send error");
close(newconn_fd);
exit(0);
}
close(newconn_fd); /* 父进程不需要 */
while(waitpid(-1,NULL,WNOHANG) > 0);/* 清除子进程 */
}
}


client.c
-----------------------------------------------------


#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/wait.h>
//#include <winsock.h>
#define PORT 16666 /* 客户机连接远程主机的端口 */
#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */
int main(int argc, char *argv[])
{
int sock_fd, numbytes;
char buf[MAXDATASIZE];
struct sockaddr_in serv_addr; /* 连接服务器的地址 */
unsigned long ip_addr;

if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
ip_addr = inet_addr("132.240.9.12");

if(ip_addr==-1)
{
perror("Address Convert Error");
exit(1);
}

serv_addr.sin_addr.s_addr = ip_addr;
bzero(&(serv_addr.sin_zero),sizeof(serv_addr.sin_zero));

if (connect(sock_fd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1)
{
perror("connect");
exit(1);
}
if ((numbytes=recv(sock_fd, buf, MAXDATASIZE, 0)) == -1)
{
printf("recv");
exit(1);
}
buf[numbytes] = '/0';
printf("Received: %s /n",buf);
close(sock_fd);
return 0;
}