最近工作日一直在忙工作,都是些YUV图像格式处理的问题,因为还没弄得很明白啊,所以没法往博客上面写
客户端程序:
执行:
昨天一天休息日又看了一天电影(罪恶啊),今天花了一中午看了点网络IPC的问题,上来写点。只当加深记忆,要是不慎被高手看到,请高手手下留情
以前一直在看APUE,可是我觉得他写的网络IPC这一章既不基础,也不高深,干脆换了本简单的,随便找了本,叫做《unix网络编程实用技术与实例分析》,我不是要说这本书有多好(其实本人并不喜欢这本书的风格),只是交代一下本人的学习背景,以备将来有据可查
本人以前一直没想清楚TCP/IP和我有什么关系,今天看了一上午,终于知道点了,原来我调用的socket就是在TCP,UDP等协议的基础上编写而成的,我调用socket编程,它本身就帮我遵守了这些协议,呵呵,好东西
其它的就好懂了
其实我觉得socket编程入门很容易,无非就是背书嘛,(哈哈,吹牛啦)
把代码拉进来,不知道大家能否看懂,我是差不多可以背了,哈哈
服务器端程序
// File: tcpserver.c
#include <stdio.h>
#include <strings.h> /* for bzero() */
#include <unistd.h> /* for close() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <arpa/inet.h>
#define PORT 1234 //将会被打开的端口
#define BACKLOG 1 //最大连接数
int main()
{
int listenfd, connectfd; //socket描述符
struct sockaddr_in server; //服务器地址信息
struct sockaddr_in client; //客户地址信息
int sin_size;
//创建套接字
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror( "Creating socket failed.");
exit(1);
}
//允许此地址重复绑定套接字
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
//绑定
bzero(&server,sizeof(server)); //可以用memset函数代替的
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr = htonl (INADDR_ANY);//主机地址
if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)
{
perror( "Bind error.");
exit(1);
}
//监听
if(listen(listenfd,BACKLOG) == -1)/* calls listen() */
{
perror( "listen() error\n");
exit(1);
}
//接受---没有接收到就给我阻塞
sin_size=sizeof(struct sockaddr_in);
if ((connectfd = accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1)
{
perror( "accept() error\n");
exit(1);
}
//发送
printf( "You got a connection from %s\n",inet_ntoa(client.sin_addr) );
send(connectfd, "Welcome to my server.\n",22,0); /* send to the client welcome message */
//close
close(connectfd); /* close connectfd */
close(listenfd); /* close listenfd */
}
#include <stdio.h>
#include <strings.h> /* for bzero() */
#include <unistd.h> /* for close() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <arpa/inet.h>
#define PORT 1234 //将会被打开的端口
#define BACKLOG 1 //最大连接数
int main()
{
int listenfd, connectfd; //socket描述符
struct sockaddr_in server; //服务器地址信息
struct sockaddr_in client; //客户地址信息
int sin_size;
//创建套接字
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror( "Creating socket failed.");
exit(1);
}
//允许此地址重复绑定套接字
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
//绑定
bzero(&server,sizeof(server)); //可以用memset函数代替的
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr = htonl (INADDR_ANY);//主机地址
if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)
{
perror( "Bind error.");
exit(1);
}
//监听
if(listen(listenfd,BACKLOG) == -1)/* calls listen() */
{
perror( "listen() error\n");
exit(1);
}
//接受---没有接收到就给我阻塞
sin_size=sizeof(struct sockaddr_in);
if ((connectfd = accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1)
{
perror( "accept() error\n");
exit(1);
}
//发送
printf( "You got a connection from %s\n",inet_ntoa(client.sin_addr) );
send(connectfd, "Welcome to my server.\n",22,0); /* send to the client welcome message */
//close
close(connectfd); /* close connectfd */
close(listenfd); /* close listenfd */
}
// File: tcpclient.c
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <netdb.h> // for struct hostent
#define PORT 1234 //在别的远程机上打开的端口
#define MAXDATASIZE 100 //数据的最大字节数
int main(int argc, char *argv[])
{
int fd, numbytes; //文件描述符
char buf[MAXDATASIZE]; //存放接受数据的缓冲
struct hostent *he;
struct sockaddr_in server; //server的地址信息
if (argc !=2)
{
printf( "Usage: %s <IP Address>\n",argv[0]);
exit(1);
}
//根据名字获取机器相关信息
if ((he=gethostbyname(argv[1]))== NULL)
{
printf( "gethostbyname() error\n");
exit(1);
}
//socket
if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1)
{
printf( "socket() error\n");
exit(1);
}
//connect
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
inet_aton(he->h_addr, &server.sin_addr);
if(connect(fd, (struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
{
printf( "connect() error\n");
exit(1);
}
//recv
if ((numbytes=recv(fd,buf,MAXDATASIZE,0)) == -1)
{
printf( "recv() error\n");
exit(1);
}
buf[numbytes]= '\0';
printf( "Server Message: %s\n",buf);
//close
close(fd);
}
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <netdb.h> // for struct hostent
#define PORT 1234 //在别的远程机上打开的端口
#define MAXDATASIZE 100 //数据的最大字节数
int main(int argc, char *argv[])
{
int fd, numbytes; //文件描述符
char buf[MAXDATASIZE]; //存放接受数据的缓冲
struct hostent *he;
struct sockaddr_in server; //server的地址信息
if (argc !=2)
{
printf( "Usage: %s <IP Address>\n",argv[0]);
exit(1);
}
//根据名字获取机器相关信息
if ((he=gethostbyname(argv[1]))== NULL)
{
printf( "gethostbyname() error\n");
exit(1);
}
//socket
if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1)
{
printf( "socket() error\n");
exit(1);
}
//connect
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
inet_aton(he->h_addr, &server.sin_addr);
if(connect(fd, (struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
{
printf( "connect() error\n");
exit(1);
}
//recv
if ((numbytes=recv(fd,buf,MAXDATASIZE,0)) == -1)
{
printf( "recv() error\n");
exit(1);
}
buf[numbytes]= '\0';
printf( "Server Message: %s\n",buf);
//close
close(fd);
}
./tcpserver &
./tcpclient
结果:
You got a connection from 127.0.0.1
(这个当然是tcpserver打印的啦,只不过在后台运行的程序突然蹦到前台罢了)
Server Message: Welcome to my server.
可以用ps -ef来查看当前运行的进程,看看在后台跑的程序是否还在跑
如果想杀死进程,则用 kill [pid] 就可以了
转载于:https://blog.51cto.com/nnssll/201401