導航:首頁 > 編程語言 > tcpsocket編程linux

tcpsocket編程linux

發布時間:2023-03-20 15:14:51

❶ socket編程在windows和linux下的區別

你好,比較可以發現:linux下的網路編程與windows下採用底層的API類似,但是也有區別:
區別一:windows下需加上WSAStartup()函數
區別二:關閉socket:linux為close(),windows為closesocket()
windows下採用上層的API,一般有CSocket和CAsynSocket這兩種類型的類
這種情況以下socket函數一般的首字母大寫。而底層的API不管是windows下的還是linux下的socket函數首字母都是小寫的。
當然兩者還有其他方面的區別和聯系,有待以後慢慢學習~!

❷ linux編程socket程序的編譯語句

server端:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include<string.h>
#include <ctype.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define MAX_LINE 100

int main()
{
struct sockaddr_in server;
struct sockaddr_in client;

int server_fd;
int client_fd;

socklen_t len;

char buf[MAX_LINE]; //用於存儲傳送內容到緩沖區
char addr_ip[INET_ADDRSTRLEN];//存儲客戶端地址緩沖區
int port = 8000;//埠號8000
int n; //讀寫位元組數

bzero(&server,sizeof(server));//清空地址結構
server.sin_family = AF_INET;//使用ipv4
server.sin_addr.s_addr = INADDR_ANY;//伺服器可以接受任意地址
server.sin_port = htons(port);//把埠號轉成網路位元組序

server_fd = socket(AF_INET,SOCK_STREAM,0);//創立套接字,使用tcp協議
bind(server_fd,(struct sockaddr *)&server,sizeof(server));//將地址和套接字綁定
listen(server_fd,10);//開始監聽

printf("waiting```\n");

while(1)
{
client_fd = accept(server_fd,(struct sockaddr *)&client,&len);
n = read(client_fd,buf,MAX_LINE);//讀取客戶端來的消息
inet_ntop(AF_INET,&client.sin_addr,addr_ip,sizeof(addr_ip));

printf("client ip is : %s , port is : %d\n",addr_ip,ntohs(client.sin_port));
printf("content is : %s\n",buf);//列印客戶端信息

write(client_fd,buf,n);//轉發回去給客戶端
close(client_fd);
}

if(close(client_fd) == -1)
{
perror("fail to close");
exit(1);
}

return 0;
}

client端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define MAX_LINE 100

int main(int argc,char * argv[])
{
struct sockaddr_in server;//伺服器地址
char buf[MAX_LINE];

int server_fd;
int port = 8000;

char *str = "test string";//默認字元串

if(argc > 1)
{
str = argv[1];//從命令參數中取得用戶輸入的串
}

bzero(&server,sizeof(server));//清空地址結構

server.sin_family = AF_INET;//使用ipv4

inet_pton(AF_INET,"192.168.228.129",&server.sin_addr);
server.sin_port = htons(port);

server_fd = socket(AF_INET,SOCK_STREAM,0);//創建套接字

connect(server_fd,(struct sockaddr *)&server,sizeof(server));

write(server_fd,str,strlen(str) + 1);
//因為是本機測試,所以不用考慮延時
read(server_fd,buf,MAX_LINE);

printf("recieve from server :%s\n",buf);
close(server_fd);

return 0;
}

//源碼來自於網路,誰寫也都類似,都是基於tcp的三次握手協議來寫的

❸ socket編程在windows和linux下的區別

下面大概分幾個方面進行羅列:

Linux要包含

[cpp]
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
等頭文件,而windows下則是包含
[cpp]
#include <winsock.h>


Linux中socket為整形,Windows中為一個SOCKET。
Linux中關閉socket為close,Windows中為closesocket。
Linux中有變數socklen_t,Windows中直接為int。
因為linux中的socket與普通的fd一樣,所以可以在TCP的socket中,發送與接收數據時,直接使用read和write。而windows只能使用recv和send。
設置socet選項,比如設置socket為非阻塞的。Linux下為

[cpp]
flag = fcntl (fd, F_GETFL);
fcntl (fd, F_SETFL, flag | O_NONBLOCK);
,Windows下為
[cpp]
flag = 1;
ioctlsocket (fd, FIONBIO, (unsigned long *) &flag);

當非阻塞socket的TCP連接正在進行時,Linux的錯誤號為EINPROGRESS,Windows的錯誤號為WSAEWOULDBLOCK。

file
Linux下面,文件換行是"\n",而windows下面是"\r\n"。
Linux下面,目錄分隔符是"/",而windows下面是"\"。
Linux與Windows下面,均可以使用stat調用來查詢文件信息。但是,Linux只支持2G大小,而Windows只支持4G大小。為了支持更大的文件查詢,可以在Linux環境下加

_FILE_OFFSET_BITS=64定義,在Windows下面使用_stat64調用,入參為struct __stat64。
Linux中可根據stat的st_mode判斷文件類型,有S_ISREG、S_ISDIR等宏。Windows中沒有,需要自己定義相應的宏,如

[cpp]
#define S_ISREG(m) (((m) & 0170000) == (0100000))
#define S_ISDIR(m) (((m) & 0170000) == (0040000))
Linux中刪除文件是unlink,Windows中為DeleteFile。

time

Linux中,time_t結構是長整形。而windows中,time_t結構是64位的整形。如果要在windows始time_t為32位無符號整形,可以加宏定義,_USE_32BIT_TIME_T。
Linux中,sleep的單位為秒。Windows中,Sleep的單位為毫秒。即,Linux下sleep (1),在Windows環境下則需要Sleep (1000)。
Windows中的timecmp宏,不支持大於等於或者小於等於。
Windows中沒有struct timeval結構的加減宏可以使用,需要手動定義:

[cpp]
#define MICROSECONDS (1000 * 1000)

#define timeradd(t1, t2, t3) do { \
(t3)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; \
(t3)->tv_usec = (t1)->tv_usec + (t2)->tv_usec % MICROSECONDS; \
if ((t1)->tv_usec + (t2)->tv_usec > MICROSECONDS) (t3)->tv_sec ++; \
} while (0)

#define timersub(t1, t2, t3) do { \
(t3)->tv_sec = (t1)->tv_sec - (t2)->tv_sec; \
(t3)->tv_usec = (t1)->tv_usec - (t2)->tv_usec; \
if ((t1)->tv_usec - (t2)->tv_usec < 0) (t3)->tv_usec --, (t3)->tv_usec += MICROSECONDS; \
} while (0)

調用進程

Linux下可以直接使用system來調用外部程序。Windows最好使用WinExec,因為WinExec可以支持是打開還是隱藏程序窗口。用WinExec的第二個入參指明,如

SW_SHOW/SW_HIDE。

雜項

Linux為srandom和random函數,Windows為srand和rand函數。
Linux為snprintf,Windows為_snprintf。
同理,Linux中的strcasecmp,Windows為_stricmp。

錯誤處理

Linux下面,通常使用全局變數errno來表示函數執行的錯誤號。Windows下要使用GetLastError ()調用來取得。

Linux環境下僅有的
這些函數或者宏,Windows中完全沒有,需要用戶手動實現。
atoll

[cpp]
long long
atoll (const char *p)
{
int minus = 0;
long long value = 0;
if (*p == '-')
{
minus ++;
p ++;
}
while (*p >= '0' && *p <= '9')
{
value *= 10;
value += *p - '0';
p ++;
}
return minus ? 0 - value : value;
}
gettimeofday

[cpp]
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define EPOCHFILETIME 11644473600000000Ui64
#else
#define EPOCHFILETIME 11644473600000000ULL
#endif

struct timezone
{
int tz_minuteswest;
int tz_dsttime;
};

int
gettimeofday (struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
LARGE_INTEGER li;
__int64 t;
static int tzflag;

if (tv)
{
GetSystemTimeAsFileTime (&ft);
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;
t = li.QuadPart; /* In 100-nanosecond intervals */
t -= EPOCHFILETIME; /* Offset to the Epoch time */
t /= 10; /* In microseconds */
tv->tv_sec = (long) (t / 1000000);
tv->tv_usec = (long) (t % 1000000);
}

if (tz)
{
if (!tzflag)
{
_tzset ();
tzflag++;
}
tz->tz_minuteswest = _timezone / 60;
tz->tz_dsttime = _daylight;
}

return 0;
}

編譯相關
當前函數,Linux用__FUNCTION__表示,Windows用__func__表示。
--------------------------------------------------------------------------------
Socket 編程 windows到Linux代碼移植遇到的問題
1)頭文件
windows下winsock.h/winsock2.h
linux下sys/socket.h
錯誤處理:errno.h

2)初始化
windows下需要用WSAStartup
linux下不需要

3)關閉socket
windows下closesocket(...)
linux下close(...)

4)類型
windows下SOCKET
linux下int
如我用到的一些宏:
#ifdef WIN32
typedef int socklen_t;
typedef int ssize_t;
#endif

#ifdef __LINUX__
typedef int SOCKET;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
#define FALSE 0
#define SOCKET_ERROR (-1)
#endif

5)獲取錯誤碼
windows下getlasterror()/WSAGetLastError()
linux下errno變數

6)設置非阻塞
windows下ioctlsocket()
linux下fcntl() <fcntl.h>

7)send函數最後一個參數
windows下一般設置為0
linux下最好設置為MSG_NOSIGNAL,如果不設置,在發送出錯後有可 能會導致程序退出。

8)毫秒級時間獲取
windows下GetTickCount()
linux下gettimeofday()

3、多線程
多線程: (win)process.h --〉(linux)pthread.h
_beginthread --> pthread_create
_endthread --> pthread_exit
-----------------------------------------------------------------
windows與linux平台使用的socket均繼承自Berkeley socket(rfc3493),他們都支持select I/O模型,均支持使用getaddrinfo與getnameinfo實現協議無關編程。但存在細微差別,

主要有:

頭文件及類庫。windows使用winsock2.h(需要在windows.h前包含),並要鏈接庫ws2_32.lib;linux使用netinet/in.h, netdb.h等。
windows下在使用socket之前與之後要分別使用WSAStartup與WSAClean。
關閉socket,windows使用closesocket,linux使用close。
send*與recv*函數參數之socket長度的類型,windows為int,linux為socklen_t,可預編譯指令中處理這一差異,當平台為windows時#define socklen_t unsigned int。
select函數第一個參數,windows忽略該參數,linux下該參數表示集合中socket的上限值,一般設為sockfd(需select的socket) + 1。
windows下socket函數返回值類型為SOCKET(unsigned int),其中發生錯誤時返回INVALID_SOCKET(0),linux下socket函數返回值類型int, 發生錯誤時返回-1。
另外,如果綁定本機回環地址,windows下sendto函數可以通過,linux下sendto回報錯:errno=22, Invalid arguement。一般情況下均綁定通配地址。
轉載jlins

❹ linux tcp socket並發編程,調用accept函數後調用fork。兩台電腦測試,為何accept返回的描述符是相同的

可能是你的fork 之後產生的子進程拷貝的代碼,它那裡執行了accept,所以導致相同,你試著在每個fork之後的函數中用個exit(1);將子進程退出,然後應該就不會有這個問題了。

❺ linux socket 編程

這類問題,你不用考慮太復雜的,可以直接使用socket提供的tcp服務介面,通過send和recv等函數處理就行了。數據建議自行寫封裝和解封函數,
介面類似這樣:int pack(char *, struct data *); int unpack(char *, struct data *);
可以按照你自己的喜好,將你的struct按照你的方式填入一個char*裡面(你直接將struct data*類型轉換後賦值給char*類型都行),然後就可以使用介面了;
你完全不用管tcp的實現機制的,tcp有擁塞控制,超時重傳,自動分包等機制,可以保證你的數據按准確的方式送達;
像什麼包的數據頭什麼的,如果你需要定義的是應用層的協議,或者你希望自定義網路層和傳輸層(使用raw方式的socket),你才需要考慮;

❻ Linux下C語言socket編程

socket編程一般是基於tcp或者udp協議來寫的,你的問題很抽象,我不知道你要的是基於tcp還是udp的socket編譯。我把相對難的基於tcp協議的socket編譯給你吧。你想看懂我的代碼需要知道tcp的三次握手機制。否則我寫了注釋,你看代碼也有點困難。 ////服務端的代碼
1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/socket.h>
4 #include <unistd.h>
5 #include <netinet/in.h>
6 #include <sys/stat.h>
7 #include <stdlib.h>
8 #include <arpa/inet.h>
9
10 #define LOCAL_PORT 1234
11 #define MAX_LEN 512
12 #define MAX_NUM 5
13
14 int main(int argc, char *argv[])
15 {
16 int sock_fd, sock_data;
17 int ret, len_addr;
18 char buf[MAX_LEN];
19 ssize_t len;
20 struct sockaddr_in local_addr, remote_addr;
21
22 sock_fd = socket(AF_INET, SOCK_STREAM, 0); //創建套接字,sock_fd是套接字描述符,類似我們的身份證號碼
23 if (sock_fd < 0)
24 {
25 perror("socket()");
26 return sock_fd;
27 }
28
29 local_addr.sin_family = AF_INET;// 協議族,ipv4
30 local_addr.sin_port = htons(LOCAL_PORT);// 把伺服器埠轉換成網路位元組序
31 local_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//把字元串形式的ip轉換成網路位元組序
32
33 ret = bind(sock_fd, (struct sockaddr *)&local_addr, (size_t)sizeof(local_addr));// 把sock_fd和本機ip,埠邦定
34 if (ret < 0)
35 {
36 perror("bind()");
37 close(sock_fd);
38 return ret;
39 }
40
41 ret = listen(sock_fd, MAX_NUM);//監聽socket
42 if (ret)
43 {
44 perror("listen()");
45 close(sock_fd);
46 return ret;
47 }
48
49 memset(buf, 0, MAX_LEN);
50
51 len_addr = sizeof(remote_addr);
52
53 sock_data = accept(sock_fd, (struct sockaddr *)&remote_addr, (socklen_t *)&len_addr);//接受客戶端的連接
54 if (ret < 0)
55 {
56 perror("accept()");
57 close(sock_fd);
58 return ret;
59 }
60
61 while (1)
62 {
63 int slen;
64 len = recv(sock_data, buf, MAX_LEN, 0);//接受客戶端的數據
65 if (len < 0)
66 {
67 perror("recv()");
68 close(sock_data);
69 close(sock_fd);
70 return len;
71 }
72 printf("%s\n", buf);
73
74 slen = send(sock_data, "congratulation!", 15, 0);//向客戶端發送數據
75 if (slen <= 0)
76 {
77 printf("slen = %d\n", slen);
78 perror("send()");
79 close(sock_data);
80 close(sock_fd);
81 return slen;
82 }
83 sleep(1);
84 }
85
86 close(sock_data);
87 close(sock_fd);
88
89 return 0;
90 }
////////////客戶端的代碼 1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/socket.h>
4 #include <unistd.h>
5 #include <netinet/in.h>
6 #include <sys/stat.h>
7 #include <stdlib.h>
8 #include <arpa/inet.h>
9
10 #define REMOTE_PORT 1234
11 #define MAX_LEN 512
12
13 int main(int argc, char *argv[])
14 {
15 int sock_fd, ret;
16 int len;
17 char buf[MAX_LEN];
18 struct sockaddr_in local_addr, remote_addr;
19
20 sock_fd = socket(AF_INET, SOCK_STREAM, 0);
21 if (sock_fd < 0)
22 {
23 perror("socket()");
24 return sock_fd;
25 }
26
28 local_addr.sin_family = AF_INET;
29 local_addr.sin_addr.s_addr = htonl(INADDR_ANY); //自動獲取本機的ip地址
30 local_addr.sin_port = htons(0); //隨機選取可用的埠,並不是指定埠為0
31
33 remote_addr.sin_family= AF_INET;
34 remote_addr.sin_port = htons(REMOTE_PORT);
35 ret = inet_aton("127.0.0.1", &remote_addr.sin_addr);
36
38 ret = bind(sock_fd, (struct sockaddr *)&local_addr, sizeof(local_addr)); //把本機的ip,port和socket綁定
39 if (ret < 0)
40 {
41 perror("bind() !");
42 close(sock_fd);
43 return ret;
44 }
45
47 ret = connect(sock_fd, (struct sockaddr *)&remote_addr, (socklen_t)sizeof(remote_addr)); //把本機的socket和對方的port,ip建立連接
48 if (ret < 0)
49 {
50 perror("connect()");
51 close(sock_fd);
52 return ret;
53 }
54
55 memset(buf, 0, MAX_LEN);
56
57 while (1)
58 {
59 int i;
60 // len = send(sock_fd, buf, (size_t)MAX_LEN, 0);
61 len = send(sock_fd, "hello", 6, 0);
62 if (len <= 0)
63 {
64 perror("send()");
65 close(sock_fd);
66 return ret;
67 }
68
69 // printf("%d-->bytes send!\n", len);
70 sleep(1);
71
72 len = recv(sock_fd, buf, MAX_LEN, 0);
73 if (len <= 0)
74 {
75 perror("recv()");
76 close(sock_fd);
77 return ret;
78 }
79
80 for (i = 0; i < len; i++)
81 {
82 printf("%c", buf[i]);
83 }
84 printf("\n");
85 }
86
87 close(sock_fd);
88
89 return 0;
90 }
你把服務端和客戶端這兩個程序分別保存為server.c和client.c。然後編譯gcc server.c -o server,gcc client .c -o client。運行時先運行服務端,用命令./server,再運行客戶端,用命令./client。 注意運行命令是「點 斜杠」,「點」表示當前目錄。

❼ Linux編程socket通信疑問

什麼是Socket
Socket介面是TCP/IP網路的API,Socket介面定義了許多函數或常式,程序員可以用它們來開發TCP/IP網路上的應用程序。要學Internet上的TCP/IP網路編程,必須理解Socket介面。

Socket介面設計者......
答案就在這里:linux
socket
通信編程
----------------------Hi,地球人,我是問答機器人小S,上面的內容就是我狂拽酷炫叼炸天的答案,除了贊同,你還有別的選擇嗎?

❽ linux socket編程後是tcp還是udp

Linux socket編程既可以是TCP連接,也可以是UDP連接。Linux socket編程首先要用socket系統調用創建一個套接字,socket系統調用的原型是:
int socket(int domain, int type, int protocol);
當socket函數的type參數指定為SOCK_STREAM時,就相當於建立的是個TCP連接;當type參數指定為SOCK_DGRAM時,建立的就是一個UDP連接。當建立TCP或者UDP連接的時候,注意把第一個參數domain指定為AF_INET。

閱讀全文

與tcpsocket編程linux相關的資料

熱點內容
主角叫李天的小說 瀏覽:573
台灣風情片 瀏覽:468
xcode新版編譯運行 瀏覽:182
原版純英文字幕電影 瀏覽:231
阿里雲如何做到雲伺服器獨立ip 瀏覽:708
單片機進制教案 瀏覽:476
有什麼好的演算法書 瀏覽:157
到達市電影院英語 瀏覽:135
韓國電影男的進健房找女教練 瀏覽:10
國內十個免費網站 瀏覽:703
雙女主的小說 瀏覽:545
邱淑貞拍過的3級 瀏覽:661
午夜電影在線觀看網頁 瀏覽:221
美國男同電影 瀏覽:558
主角穿越電影強化性能力 瀏覽:837
主角林楓穿越到異界 瀏覽:469
小說下載書包網txt在線下載 瀏覽:969
肉很多很欲的高質量現言 瀏覽:428
電影愛情來得不準時塞爾維亞 瀏覽:748
有關監獄的恐怖片 瀏覽:242