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

int main(int argc, char *argv[])
{
struct sockaddr_in stsockaddr;
//宣告整數變數名稱
int r, n;
//先建立一個socket連線,SOCK_STREAM表示跑tcp協定,0表示預設值(通常都不會修改它就使用預設值),再把回傳值給SocketFD
int socketfd= socket(PF_INET, SOCK_STREAM, 0);
//建立一個buf,來接收資料
char buf[1024];
//使用螢幕判斷ip address,如果相加不等於2(前面(執行檔名稱)後面(IP位址))就會輸出,判斷程式碼錯誤
if (argc != 2)
{
fputs("usage: a.out <IP address>\n", stdout);
return -1;
}
//建立一個判斷socket是否錯誤,如果錯誤就不會繼續往下執行
if (-1 == socketfd)
{
perror("cannot create socket");
exit(EXIT_FAILURE);
}
//一開始的空間把它設定為0
bzero(&stsockaddr, sizeof(stsockaddr));

stsockaddr.sin_family = AF_INET; //使用ipv4
stsockaddr.sin_port = htons(1100); //埠編號1100
r = inet_pton(AF_INET, argv[1], &stsockaddr.sin_addr); //因為使用螢幕來輸入IP,儲存的位置在argv裡,最後在將轉換後放sin_addr裡
//相對的下面if..else就是上面r判斷式
if (0 > r)
{
perror("error: first parameter is not a valid address family");
close(socketfd);
exit(EXIT_FAILURE);
}
else if (0 == r)
{
perror("char string (second parameter does not contain valid ipaddress");
close(socketfd);
exit(EXIT_FAILURE);
}
//接下來做connect(連結動作),第一個欄位socket名稱,連結stSockAddr,建立大小的欄位
if (-1 == connect(socketfd, (struct sockaddr *)&stsockaddr, sizeof(stsockaddr)))
{
perror("connect failed");
close(socketfd);
exit(EXIT_FAILURE);
}
//建立一個寫的動作
while ((n = recv(socketfd, buf, sizeof(buf), 0)) > 0)
{
buf[n] = 0;
fputs(buf, stdout);
}

close(socketfd);
return 0;
}

參考來源:socket_tcp_client
 

Top