最近工做日一直在忙工做,都是些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 */
}
客戶端程序:
// 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);
}
執行:
./tcpserver &
./tcpclient
結果:
You got a connection from 127.0.0.1
(這個固然是tcpserver打印的啦,只不過在後臺運行的程序忽然蹦到前臺罷了)
Server Message: Welcome to my server.
能夠用ps -ef來查看當前運行的進程,看看在後臺跑的程序是否還在跑
若是想殺死進程,則用 kill [pid] 就能夠了